シンボリックリファレンス

人に説明できるほど知らなかったので調べてみた。
プログラミング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";
}