Ответ 1
Назначение glob
*glob = VALUE
содержит некоторую магию, которая зависит от типа VALUE
(т.е. возвращаемого значения, скажем, Scalar::Util::reftype(VALUE)
). Если VALUE
является ссылкой на скаляр, массив, хеш или подпрограмму, тогда будет перезаписана только эта запись в таблице символов.
Эта идиома
local *array = shift();
#use @array here
работает как задокументировано, когда первый аргумент подпрограммы является ссылкой на массив. Если первый аргумент был вместо этого, скажем, скалярной ссылкой, то только назначение $array
, а не @array
будет зависеть от назначения.
Немного демо script, чтобы узнать, что происходит:
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, эта идиома была полезной для передачи массивов и хэшей в подпрограммы.