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


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

リファレンスは、もし未定義であれば、必要に応じて存在するようになると言い ましたが、もしリファレンスとして使われた値が、既に定義されていたときには、 どのようになるのか示していませんでした。このような場合にリファレンスとし て使ったなら、それは、シンボリックリファレンスとして扱われます。つまり、 スカラの値は、無名 (であるかもしれない) 値への直接のリンクではなく、変数 の「名前」として扱われます。

そのように働くと思われていることが多いものです。それでそう動きます。

$name = "foo";
$$name = 1;               # $foo を設定
${$name} = 2;             # $foo を設定
${$name x 2} = 3;         # $foofoo を設定
$name->[0] = 4;           # $foo[0] を設定
@$name = ();              # @foo をクリア
&$name();                 # &foo() を呼び出す(Perl 4 同様)
$pack = "THAT";
${"${pack}::$name"} = 5;  # eval なしで $THAT::foo を設定

これは、非常に強力で、多少危険でもあります。(最大限の注意をはらって) ハー ドリファレンスを使おうとした場合にも、誤ってシンボリックリファレンスを使っ てしまうような場合があるからです。これを防止するには、

use strict 'refs';

と書いて、囲っているブロック内の残りの部分では、ハードリファレンスのみが 許されるようにすることができます。内側のブロックでは、

no strict 'refs';

と書いて、打ち消すこともできます。

シンボリックリファレンスでは、パッケージ変数だけを見ることができます。 (my() で宣言した) 静的なローカル変数は、シンボルテーブルにありま せんので、シンボリックリファレンスでは参照することができません。たとえば:

local($value) = 10;
$ref = \$value;
{
    my $value = 20;
    print $$ref;
}

これは、20 ではなく、10 と出力します。local() は、パッケージで 「グローバルな」、パッケージ変数に影響するものです。


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

検索式: