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