use strict; use warnings; use lib 'C:\scripts'; package Foo; sub bar { print "I am bar from Foo.\n"; } package main; no warnings 'redefine'; *Foo::real_bar = \&Foo::bar; *Foo::bar = sub { print "I am bar NEW!\n"; Foo->real_bar; *Foo::bar = \&Foo::real_bar; }; &print_stuff; sub print_stuff { &print_bar1; &print_bar2; } sub print_bar1 { Foo->bar; } sub print_bar2 { Foo->bar; } #################### OUTPUT: plxc16479> $h2/scripts/tmp.pl # output from redefined sub I am bar NEW! # output from original sub called from inside redefined sub I am bar from Foo. # output from original sub after being redefined back I am bar from Foo.