my $f; $f = sub { if (/alpha/) { do_alpha(); $f = \&do_beta; } else { do_beta(); } }; while () { $f->(); } sub do_alpha { print "do_alpha(): \$f = $f, \$_ = $_"; } sub do_beta { print "do_beta(): \$f = $f, \$_ = $_"; } __DATA__ beta beta beta beta alpha beta beta beta beta beta beta beta beta #### do_beta(): $f = CODE(0x796e88), $_ = beta do_beta(): $f = CODE(0x796e88), $_ = beta do_beta(): $f = CODE(0x796e88), $_ = beta do_beta(): $f = CODE(0x796e88), $_ = beta do_alpha(): $f = CODE(0x796e88), $_ = alpha do_beta(): $f = CODE(0x7c6ee8), $_ = beta do_beta(): $f = CODE(0x7c6ee8), $_ = beta do_beta(): $f = CODE(0x7c6ee8), $_ = beta do_beta(): $f = CODE(0x7c6ee8), $_ = beta do_beta(): $f = CODE(0x7c6ee8), $_ = beta do_beta(): $f = CODE(0x7c6ee8), $_ = beta do_beta(): $f = CODE(0x7c6ee8), $_ = beta do_beta(): $f = CODE(0x7c6ee8), $_ = beta