use strict; use warnings; #return a pointer to a function that should be invoked sub makeLazy { my ($inp) = @_; sub { eval $inp; die if $@; }; } my $i = 1; my $part2 = makeLazy('print "\nnow its $i";'); print "\ni is ".$i++; $part2->(); print "\ni is $i"; #### Global symbol "$i" requires explicit package name at (eval 1) line 1. ...propagated at test.pl line 8. #### use strict; use warnings; my $i = 1; my $part2 = sub {print "\nnow its $i"; }; print "\ni is ".$i++; $part2->(); print "\ni is $i";