OK, so as not to disappoint...
Introducing Acme::Asplode: it lets you drag your caller's lexical variables kicking and screaming into your sub. Ought to work in Perl 5.12+.
Example usage...
use 5.012;
use strict;
use warnings;
use Acme::Asplode;
sub bar
{
asplode($x, $y); # steal lexical variables from our caller!
say $x;
say $y;
asplode @A, $z; # steal moar lexicals!!!
say $z;
$z++; # alter our caller's lexical variable!!
say for @A;
};
sub foo
{
my $x = 1;
my $y = 2;
my $z = 3;
my @A = qw(a b c);
bar();
say "Z is changed: $z";
}
foo();
Update: Acme::Asplode, renamed Acme::Lexical::Thief is now on CPAN.
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
|