在
this question年,海报问如何做到以下一行:
sub my_sub { my $ref_array = shift; my @array = @$ref_array; }
通过我对基本Perl魔法的了解,我将通过简单的使用以下方式避免:
sub my_sub { my $ref_array = shift; for (@$ref_array) { #do somthing with $_ here }; #use $ref_array->[$element] here }
然而在this answer年,SO的当地僧侣tchrist建议:
sub my_sub { local *array = shift(); #use @array here }
当我问
In trying to learn the mid-level Perl
magic,can I ask,what is it that you
are setting to what here? Are you
setting a reference to @array to the
arrayref that has been passed in? How
do you know that you create @array and
not %array or $array? Where can I
learn more about this * operator
(perlop?). Thanks!
我被建议要求它作为一个新的职位,虽然他给了很好的参考。无论如何,这里呢?有人可以解释什么被分配到什么以及如何来得到@array创建,而不是%array或$ array?谢谢。
解决方法
分配给球
*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
和@L_502_3@的附加文档。在引用之前的日子里,Perl的一部分,这个成语有助于传递数组和散列成子程序。