sub outer { my $helper; $helper = sub { ... }; my $delay_cleanup = on_release {$helper = undef}; $helper->(@_); } #### sub outer { my @helper; local $helper[0] = sub { ... }; $helper[0]->(@_); } #### { my %in_node; sub something_recursive { my $node = shift; if ($in_node{$node->{name}}) { confess("Can't access $node->{name} while accessing $node->{name}"); } local $in_node{$node->{name}} = 1; ... } }