Perlでレキシカル変数を外部からいじる方法
読了まで:約1分
概要: Perl で
外部スコープから
結論から
使い方は
use strict;
use warnings;
use PadWalker qw( peek_my );
use Perl6::Say;
{
my $x = 'foo';
say $x; # 'foo'
&magic();
say $x; # 'bar'
}
sub magic {
my $vars = peek_my(1);
${ $vars->{'$x'} } = 'bar';
}
で、
blosxom のpackage
のmy
でpeek_my
で
んで、peek_sub
使えばできるんじゃね?
package foo;
my $confA = 'AAA';
my $confB = 'BBB';
sub start {
return 1;
}
package bar;
use PadWalker qw( peek_sub );
my $start_sub = foo->can('start');
my $vars = peek_sub( $start_sub );
${ $vars->{'$confA'} } = 'BBB';
${ $vars->{'$confB'} } = 'BBB';
どう$confA
$confB
はpackage
start
内のpeek_sub
レキシカル変数を参照できるスコープを持つ CODE reference を取得し、その CODE reference からpeek_sub
を使ってレキシカル変数を取得できる というわけ。
peek_sub
を言葉に
まあそういう
なんか
追記
どうも嘘書いてたっぽい 。
今
どうした
#FIXME