PadWalkerという呪文でレキシカル変数を外から見る
Re: http://d.hatena.ne.jp/tokuhirom/20090319/1237428528
PadWalker(PadWalker - play with other peoples' lexical variables - metacpan.org)
という呪文でも、こざかしいテクニックを打ち破る事ができます。
コードはこちら。
{ package F; use strict; use warnings; use Class::InsideOut qw'public readonly private register id new'; private name => my %name; sub greeting { my $self = shift; return "hello, my name is $name{id $self}"; } } { package main; use Data::Dumper; my $f = F->new( { name => 'dankogai' } ); warn Dumper($f); print $f->greeting, "\n"; use PadWalker qw(peek_sub); my $scope = peek_sub( $f->can('greeting') ); warn Dumper($scope); $scope->{'%name'}->{ id $f} = 'holidays-l'; warn Dumper($scope); print $f->greeting, "\n"; }
id:tokuhiromのコードと実行結果が少し違いますが、中身見れますし書き換えも出来ます。
$VAR1 = bless( do{\(my $o = undef)}, 'F' ); hello, my name is dankogai $VAR1 = { '%name' => { '268943024' => 'dankogai' }, '$self' => \undef }; $VAR1 = { '%name' => { '268943024' => 'holidays-l' }, '$self' => \undef }; hello, my name is holidays-l