@_
Perl中的含义是什么?
Answers:
perldoc perlvar是检查任何特殊名称的Perl变量信息的第一位。
报价单:
@_
:在子例程中,数组@_
包含传递给该子例程的参数。
在perlvar链接的perldoc perlsub(Perl子例程)中可以找到更多详细信息:
传入的所有参数都显示在数组中
@_
。因此,如果您使用两个参数调用函数,则这些参数将存储在
$_[0]
和中$_[1]
。该数组
@_
是一个局部数组,但其元素是实际标量参数的别名。特别是,如果元素$ _ [0]被更新,则相应的参数将被更新(或者,如果它不可更新,则会发生错误)。如果参数是在调用函数时不存在的数组或哈希元素,则仅在(如果有)对其进行修改或对其进行引用时才创建该元素。(一些早期版本的Perl不管是否分配了元素都创建了该元素。)分配给整个数组@_会删除该别名,并且不会更新任何参数。
通常,使用变量扩展传递给子级的@_
参数:
sub test{
my ($a, $b, $c) = @_;
...
}
# call the test sub with the parameters
test('alice', 'bob', 'charlie');
perlcritic声称这是正确的方法。
perlcritic
个人认为这对函数是最好的,但是对于方法来说,它对于shift
自引用很有用,然后解压缩@_
数组。这清楚表明这是一种方法,并且该方法采用某些参数
@
用于数组。
在子例程中或在Perl中调用函数时,可以传递参数列表。在这种情况下,@_
可以使用is将参数列表传递给函数:
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(@_)
...行,此处传递输入参数。
use strict
。因此,我编辑了您的子功能。
永远不要尝试编辑@_变量!!!!切勿触摸它们。否则,您会得到意想不到的效果。例如...
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
在调用sub1 $ size之前包含1234。但是在500(!!)之后,因此您不要编辑此值!!!您可以传递两个或多个值,然后在子例程中对其进行更改,所有这些值都将被更改!我从未见过这种效果的描述。我见过的程序也将@_ array保留为只读。并且只有您可以安全地传递变量,才不要更改内部子例程,您必须始终这样做:
sub sub2{
my @m=@_;
....
}
将@_分配给本地子例程过程变量,然后使用它们。同样,在一些深化数组的深度递归算法中,您可以使用这种方法来减少用于本地变量的内存。仅当返回@_数组相同时。