use strict; use warnings; $::clos = $::clos = "global"; sub foo { my $clos = shift; my $sub = shift; &$sub() if $sub; return sub { eval 'print "$clos\n"' } } foo("baz", foo("bar"));