Назначение глобу
*glob = VALUE
содержит магию, которая зависит от типа VALUE
(т. Е. Возвращаемое значение, скажем, Scalar::Util::reftype(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, эта идиома была полезна для передачи массивов и хэшей в подпрограммы.