Go to the first, previous, next, last section, table of contents.


シンボルテーブル

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

検索式: