シンボリックリファレンス
人に説明できるほど知らなかったので調べてみた。
プログラミングPerl P304から引用。
ハードリファレンス以外の値をデリファレンスしようと試みると、何が起こるだろうか?その場合には、値はシンボリックリファレンス(symbolic reference)として扱われる。
(中略)
シンボリックリファレンスは必ずパッケージシンボルテーブルの中を探すので、シンボリックリファレンスによってアクセスできるのは、パッケージ変数だけである。
ふむー。試してみる。
$name = "symbol"; #パッケージ変数 $$name = "test"; #ハードじゃないので、シンボリック #my $$name = "test"; #シンボリックリンクはレキシカル変数を見ることはできない print "$name"."\n"; print "$$name"."\n";
でuse strict;しているとシンボリックリファレンスが使えないので、使うときはno strict 'refs';を
use strict; my $name = "symbol"; { no strict 'refs'; $$name = "test"; print $$name."\n"; }
型グロブとも密接に関係あり。
use strict; my $name = "symbol"; { no strict 'refs'; $$name = "test"; #シンボリックリファレンス # 同じものを出力 print $$name."\n"; print ${*symbol}."\n"; #結局パッケージ変数の$symbolと同じ our $symbol = "haha"; print $$name."\n"; print ${*symbol}."\n"; #リストでも同じ @$name = ('a', 'b', 'c'); print @$name,"\n"; print @{*symbol},"\n"; }