ふと気になったので。
use Perl6::Say;
our $a = 10;
say "\*a(G):\t",\*a,"\t\$a=$a\t", \$a;
my $x = \$a;
my $y;
{
local $a = 20;
$y = \$a;
say "\*a(L):\t",\*a,"\t\$a=$a\t", \$a;
say "\*x:\t",\*x,"\t\$x=$$x\t", $x;
}
say "\*a(G):\t",\*a,"\t\$a=$a\t", \$a;
say "\*x:\t",\*x,"\t\$x=$$x\t", $x;
say "\*y:\t",\*y,"\t\$y=$$y\t", $y;
これを実行する
$ perl typet.pl
*a(G): GLOB(0x80f480) $a=10 SCALAR(0x80f4e0)
*a(L): GLOB(0x80f480) $a=20 SCALAR(0x8041c0)
*x: GLOB(0x832f50) $x=10 SCALAR(0x80f4e0)
*a(G): GLOB(0x80f480) $a=10 SCALAR(0x80f4e0)
*x: GLOB(0x832f50) $x=10 SCALAR(0x80f4e0)
*y: GLOB(0x8330b0) $y=20 SCALAR(0x8041c0)
型グロブはlocal宣言しても同じメモリ上の位置を見に行く(0x80f480)。そこから先、つまり$(*a)の結果が変わる。元の変数が待避されるってのはリファレンスがいじられるってことか。
ということは、値の入ってるメモリの位置さえ分かっていれば、localで宣言する前の値にアクセスできるし($x)、localで宣言した値をスコープの外へ持ち出すってことも可能($y)なのね。