use AtExit;
sub awful {
my ($various,%shared,@vars);
my ($recusive1,$recursive2);
my $cleanup = AtExit->new(sub{
undef $recursive1;
undef $recursive2;
});
$recursive1 = sub {
# Do stuff with $various,%shared,@vars and make further calls to
# $recursive1->() and $recursive2->()
}
$recursive2 = sub {
# Do stuff with $various,%shared,@vars and make further calls to
# $recursive1->() and &$recursive2->() and call
frobnicate($recursive1);
}
$recursive1->();
}
####
our ($various,%shared,@vars);
sub awful {
local ($various,%shared,@vars);
recursive1();
}
sub recursive1 {
# Do stuff with $various,%shared,@vars and make further calls to
# recursive1() and recursive2()
}
sub recursive2 {
# Do stuff with $various,%shared,@vars and make further calls to
# recursive1() and recursive2()
frobnicate(\&recursive1);
}
##
##
use strict;
use warnings;
sub foo {
my $x = shift;
print "$x ";
sub foo1 {
print "$x "; # Warning
}
foo1();
'' =~ /(?{ print "$x\n" })/; # No warning
}
foo('Hello'); # Prints 'Hello Hello Hello'
foo('Goodbye'); # Prints 'Goodbye Hello Hello'
sub bar {
local our $x = shift;
print "$x ";
sub bar1 {
print "$x ";
}
bar1();
'' =~ /(?{ print "$x\n" })/;
}
bar('Hello'); # Prints 'Hello Hello Hello'
bar('Goodbye'); # Prints 'Goodbye Goodbye Goodbye'
__END__