@_
在 Perl 中的含义是什么?
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
,个人认为对于一个函数来说这样做是最好的,但对于一个方法来说,将 self 引用进行 shift
操作,然后解包 @_
数组是有用的。这使得它清楚地表明这是一个方法,并且该方法需要特定的参数。 - Joel Berger@_
的意思。 回答这个问题的是,就像$_
在Perl中代表它一样,@_
同样代表 他们。
似乎没有人提到其关键含义-以及他们。
它们通常被用作代词,或者有时用作主题化语言标记。
它们通常有名词先行语,但不总是。
在大多数情况下,您也可以使用 shift 键来处理单个变量:
$var1 = shift;
这是一个话题,您应该进一步研究,因为Perl有许多有趣的方法可以在您的子例程中访问外部信息。
$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);
print @_[0]; # 'Mr.Bond'
$str
并设置数组@_
。永远不要尝试编辑@_变量!!!它们必须不被操作。否则,您会得到一些意想不到的效果。例如...
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
在调用sub1之前,$size的值为1234。但是调用后变成了500(!!)。所以不要编辑这个值!!!你可以传递两个或更多的值,并在子程序中更改它们,所有这些值都将被更改!我从未见过这种效果的描述。我看到的程序也会将@_数组保留为只读。只有这样,你才能安全地传递变量而不改变内部子程序。你必须始终这样做:
sub sub2{
my @m=@_;
....
}
将 @_ 分配给本地子程序过程变量,然后与它们一起工作。
在一些深递归算法中,如果返回数组,则可以使用此方法来减少用于本地变量的内存占用。仅当返回的 @_ 数组相同时才能使用此方法。
@
用于数组。
在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(@_)
这一行... 这里它传递了输入参数。use strict
。我已经编辑了你的子函数。 - EverythingRightPlace