在这个问题中,海报询问如何在一行中执行以下操作:
sub my_sub {
my $ref_array = shift;
my @array = @$ref_array;
}
Run Code Online (Sandbox Code Playgroud)
凭借我对基本Perl魔法的了解,我可以通过简单地使用以下内容来避免:
sub my_sub {
my $ref_array = shift;
for (@$ref_array) {
#do somthing with $_ here
};
#use $ref_array->[$element] here
}
Run Code Online (Sandbox Code Playgroud)
然而,在这个答案中,SO的当地僧侣之一提出:
sub my_sub {
local *array = shift();
#use @array here
}
Run Code Online (Sandbox Code Playgroud)
当我问
在尝试学习中级Perl魔法时,我可以问一下,你在这里设置什么是什么?您是否将@array的引用设置为已传入的arrayref?你怎么知道你创建@array而不是%array或$ array?我在哪里可以了解有关此*运算符的更多信息(perlop?).谢谢!
有人建议我把它作为一个新帖子,尽管他确实提供了很好的参考.无论如何,这里呢?有人可以解释什么被分配给什么以及如何创建@array而不是%array或$ array?谢谢.
mob*_*mob 23
分配给一个glob
*glob = VALUE
Run Code Online (Sandbox Code Playgroud)
包含一些取决于类型的魔法VALUE(例如,返回值,比方说Scalar::Util::reftype(VALUE)).如果VALUE是对标量,数组,散列或子例程的引用,则只会覆盖符号表中的该条目.
这个成语
local *array = shift();
#use @array here
Run Code Online (Sandbox Code Playgroud)
当子例程的第一个参数是数组引用时,记录的工作原理.如果第一个参数是一个标量引用,那么只有$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
Run Code Online (Sandbox Code Playgroud)
输出:
@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 ------------------
额外的doc perlmod和perldata.在引用是Perl的一部分之前的日子里,这个习惯用法有助于将数组和哈希传递到子例程中.
| 归档时间: |
|
| 查看次数: |
7554 次 |
| 最近记录: |