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