--- /dev/null
+use strict;
+use warnings;
+
+use Sub::Uplevel;
+
+# subroutine A calls subroutine B with uplevel(), so when
+# subroutine B queries caller(), it gets main as the caller (just
+# like subroutine A) instead of getting subroutine A
+
+sub sub_a {
+ print "Entering Subroutine A\n";
+ print "caller() says: ", join( ", ", (caller())[0 .. 2] ), "\n";
+ print "Calling B with uplevel\n";
+ uplevel 1, \&sub_b;
+}
+
+sub sub_b {
+ print "Entering Subroutine B\n";
+ print "caller() says: ", join( ", ", (caller())[0 .. 2] ), "\n";
+}
+
+sub_a();
+