割り当て
*glob = VALUE
は(すなわち、Scalar::Util::reftype(VALUE)
、たとえば、の値を返す)VALUE
の種類に依存し、いくつかの魔法が含まれています。 VALUE
がスカラー、配列、ハッシュ、またはサブルーチンへの参照である場合、のみがシンボルテーブルのエントリを上書きします。
このイディオムサブルーチンへの最初の引数は配列リファレンスである場合に文書化されているよう
local *array = shift();
#use @array here
作品。最初の引数がスカラー参照ではなく$array
で、@array
でない場合は、代入の影響を受けます。
何が起こっているかを見るために少しデモスクリプトは:
no strict;
sub F {
local *array = shift;
print "\@array = @array\n";
print "\$array = $array\n";
print "\%array = ",%array,"\n";
print "------------------\n";
}
$array = "original scalar";
%array = ("original" => "hash");
@array = ("orignal","array");
$foo = "foo";
@foo = ("foo","bar");
%foo = ("FOO" => "foo");
F ["new","array"]; # array reference
F \"new scalar"; # scalar reference
F {"new" => "hash"}; # hash reference
F *foo; # typeglob
F 'foo'; # not a reference, but name of assigned variable
F 'something else'; # not a reference
F(); # undef
出力:
@array = new array
$array = original scalar
%array = originalhash
------------------
@array = orignal array
$array = new scalar
%array = originalhash
------------------
@array = orignal array
$array = original scalar
%array = newhash
------------------
@array = foo bar
$array = foo
%array = FOOfoo
------------------
@array = foo bar
$array = foo
%array = FOOfoo
------------------
@array =
$array =
%array =
------------------
@array = orignal array
$array = original scalar
%array = originalhash
------------------
追加ドキュメントperlmod
とperldata
で。参照がPerlの一部となる前の頃、このイディオムは配列とハッシュをサブルーチンに渡すのに役立ちました。
出典
2011-02-01 17:07:39
mob
[この回答](http://stackoverflow.com/questions/3807231/how-can-i-test-if-i-can-write-to-a-からタイプグロブへのいくつかの重要な洞察を集めることができますファイルハンドル/ 4200474#4200474)、ここではまだ触れられていません。 – tchrist