use strict; use warnings; sub foo { my $bar if 0; # <--- HACK! $bar = @_ ? shift : 1; sub bar { my $foo = shift; return $foo * (++$bar); } my $result = bar($bar); $result; } warn "calling foo(1): 1 * 2 = " . foo(1) . "\n"; warn "calling foo(): 1 * 2 = " . foo() . "\n"; warn "calling foo(): 1 * 2 = " . foo() . "\n"; warn "calling bar(5): 3 * 5 = " . bar(5) . "\n"; warn "calling foo(3): 3 * 4 = " . foo(3) . "\n"; __END__ Variable "$bar" will not stay shared at bar.pl line 17. calling foo(1): 1 * 2 = 2 calling foo(): 1 * 2 = 2 calling foo(): 1 * 2 = 2 calling bar(5): 3 * 5 = 15 calling foo(3): 3 * 4 = 12