パッケージのシンボルテーブルは、パッケージ名に 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.