Perl中@_
的含义是什么?
答案 0 :(得分:110)
perldoc perlvar是第一个检查任何特殊名称的Perl变量信息的地方。
引用:
@_
:在子例程中,数组@_
包含传递给该子例程的参数。
可以在perlvar链接的perldoc perlsub (Perl subroutines)中找到更多详细信息:
传入的任何参数都显示在 数组
@_
。因此,如果您使用两个参数调用函数,那么 将存储在
中$_[0]
和$_[1]
。数组
@_
是本地数组,但是它 元素是实际标量参数的别名。 特别是,如果 一个元素$ _ [0]被更新了 相应的参数更新(或 如果不是,则会发生错误 可更新)。如果参数是数组 或者不存在的哈希元素 当函数被调用时,那个 元素仅在(和如果)时创建 它被修改或引用它 拍摄。 (Perl的一些早期版本 无论是否创建了元素 元素已分配给。)分配给 整个数组@_删除了 别名,并且不会更新任何 参数。
答案 1 :(得分:23)
通常,您使用@_
变量扩展传递给 sub 的参数:
sub test{
my ($a, $b, $c) = @_;
...
}
# call the test sub with the parameters
test('alice', 'bob', 'charlie');
perlcritic声称这是正确的。
答案 2 :(得分:9)
问题是Perl中@_
的含义是什么。这个问题的答案是,只要$_
在Perl中表示它,@_
同样意味着他们。
似乎没有人提到其含义的这一重要方面 - 以及他们的。
因此,它们既可以用作代词,也可以用作主题词。它们通常具有名义上的前因,但并非总是如此。
答案 3 :(得分:8)
答案 4 :(得分:5)
所有Perl的“特殊变量”都列在perlvar文档页面中。
答案 5 :(得分:5)
在大多数情况下,您还可以对个别变量使用shift:
$var1 = shift;
这是一个你应该进一步研究的主题,因为Perl有许多有趣的方法来访问子例程中的外部信息。
答案 6 :(得分:2)
此外,如果函数返回一个数组,但调用该函数时不将其返回的数据分配给任何变量,如下所示。这里调用了split(),但它没有分配给任何变量。我们可以稍后通过@_:
访问其返回的数据$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);
print @_[0]; # 'Mr.Bond'
这将拆分字符串$str
并设置数组@_
。
答案 7 :(得分:1)
@
用于数组。
在子例程中或在Perl中调用函数时,可以传递参数列表。在这种情况下,@_
可用于将参数列表传递给函数:
sub Average{
# Get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_){
# foreach is like for loop... It will access every
# array element by an iterator
$sum += $item;
}
$average = $sum / $n;
print "Average for the given numbers: $average\n";
}
Average(10, 20, 30);
如果您观察上述代码,请参阅foreach $item(@_)
行...此处传递输入参数。
答案 8 :(得分:0)
永远不要尝试编辑@_变量!!!!他们必须不被触及..或者你得到一些意想不到的效果。例如......
final BroadcastReceiver receiver = new AlarmReceiver();
final IntentFilter intentFilter = new IntentFilter(ALARM_RECEIVER_INTENT_TRIGGER);
context.registerReceiver(receiver, intentFilter);
在调用sub1 $ size之前包含1234.但是在500之后(!!)所以你不要编辑这个值!您可以传递两个或更多值并在子例程中更改它们,所有这些值都将被更改!我从来没有见过这种效果。我见过的程序也会留下@_ array readonly。只有你可以安全地传递变量不改变内部子程序 你必须始终这样做:
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
将@_分配给本地子程序过程变量,然后使用它们。 此外,在一些返回数组的深度递归算法中,您可以使用此方法来减少用于本地变量的内存。只有返回@_数组才一样。