use strict; use warnings; use Return::MultiLevel qw/with_return/; our %returns; sub rec { my ($i) = @_; $i++; print ">> i=$i\n"; if ($i <= 9) { with_return { $returns{$i} = shift; rec($i); }; } if (@ARGV) { my $r = shift @ARGV; print "RESTORE $r\n"; $returns{$r}->(); } print "<< i=$i\n"; } rec(0); __END__ #### $perl ml_a.pl 6 >> i=2 >> i=3 >> i=4 >> i=5 >> i=6 >> i=7 >> i=8 >> i=9 >> i=10 RESTORE 6 << i=6 << i=5 << i=4 << i=3 << i=2 << i=1 #### $perl ml_a.pl 3 >> i=1 >> i=2 >> i=3 >> i=4 >> i=5 >> i=6 >> i=7 >> i=8 >> i=9 >> i=10 RESTORE 3 << i=3 << i=2 << i=1