パッケージのシンボルテーブルは、パッケージ名に 2 つのコロンを付けた名前 の連想配列に蓄えられます。つまり、`main' のシンボルテーブルは、 `%main::'、または短く `%::' となります。同様に、先に述べたネス トしたパッケージは `%OUTER::INNER::' となります。
連想配列の個々のエントリの value は、*name 記法を使ったときに参照するも のです。実際、
local(*main::foo) = *main::bar; local($main::{'foo'}) = $main::{'bar'};
は、前者がシンボルテーブルの検索をコンパイル時に行ないますので、より効率 的ですが、同じことを行ないます。
たとえば、これを使って、パッケージ内のすべての変数を出力することができま す。
以下は、Perl ライブラリの `dumpvar.pl' です:
package dumpvar; sub main::dumpvar { ($package) = @_; local(*stab) = eval("*${package}::"); while (($key,$val) = each(%stab)) { local(*entry) = $val; if (defined $entry) { print "\$$key = '$entry'\n"; } if (defined @entry) { print "\@$key = (\n"; foreach $num ($[ .. $#entry) { print " $num\t'",$entry[$num],"'\n"; } print ")\n"; } if ($key ne "${package}::" && defined %entry) { print "\%$key = (\n"; foreach $key (sort keys(%entry)) { print " $key\t'",$entry{$key},"'\n"; } print ")\n"; } } }
このサブルーティンは、パッケージ `dumpvar' でコンパイルされているに も関らず、サブルーティンの名前が修飾されているため、パッケージ `main' の中に入れられることになります。
シンボルテーブルエントリへの代入は、別名付け操作になります。つまり、
*dick = *richard;
は、`richard' という名前でアクセスできる変数、サブルーティン、ファ イルハンドルを `dick' という名前でもアクセスできるようにします。リ ファレンスを使えば、特定の変数だけ、サブルーティンだけ、というように個別 に別名を付けることができます:
*dick = \$richard;
は、$richard と $dick を同じ変数にしますが、@richard と @dickは別の配 列のままです。難しいですか。
Go to the first, previous, next, last section, table of contents.