Perl中@_的含义是什么?
Perl中@_
的含义是什么?
perldoc perlvar是第一个检查任何特殊名称Perlvariables信息的地方。
引用:
@_
:在子程序中,数组@_
包含传递给子程序的参数。
更多的细节可以从perlvar中链接的perldoc perlsub(Perl子例程)中find:
任何传入的参数都显示在数组
@_
。因此,如果你用两个参数调用一个函数,这些函数将存储在
$_[0]
和$_[1]
。数组
@_
是一个本地数组 ,但其元素是实际标量参数的别名 。 特别是,如果更新元素$ _ [0],则会更新相应的参数(如果不可更新,则会发生错误)。如果参数是调用函数时不存在的数组或哈希元素,则只有在修改了该元素(或者如果)或对其进行了引用时才创build该元素。 (一些早期版本的Perl创build了该元素是否被分配给该元素。)分配给整个数组@_将移除该别名,并且不更新任何参数。
通常,使用@_
variables扩展传递给子的参数:
sub test{ my ($a, $b, $c) = @_; ... } # call the test sub with the parameters test('alice', 'bob', 'charlie');
这是正确的方式是perceritic 。
searchperl @_
第一个命中是这样说的:
@_是传入子参数的列表。
它也有相同的更长和更详细的解释。
问题是Perl中@的含义 。 这个问题的答案是,就像$_
在Perl中表示的那样,@同样意味着它们 。
似乎没有人提及其意义的这个关键方面 – 以及他们的 。
因此,它们都被用作代词,有时也被用作主题词。
他们通常有名义前因,虽然不总是。
所有Perl的“特殊variables”列在perlvar文档页面中。
在大多数情况下,您也可以使用移动单个variables:
$var1 = shift;
这是一个你应该进一步研究的话题,因为Perl有很多有趣的方式来访问子例程中的外部信息。
另外,如果一个函数返回一个数组,但是调用该函数时不会将其返回的数据赋值给下面的任何variables。 这里调用了split(),但是它没有被赋值给任何variables。 稍后我们可以通过@_访问它的返回数据:
$str = "Mr.Bond|Chewbaaka|Spider-Man"; split(/\|/, $str); print @_[0]; # 'Mr.Bond'
这将分割string$str
并设置数组@_
。
@
用于数组。
在一个子程序中或者当你在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(@_)
行…在这里它传递input参数。
永远不要试图编辑@_variables! 他们必须不被触碰..或者你得到一些不可思议的效果。 例如…
my $size=1234; sub sub1{ $_[0]=500; } sub1 $size;
之前调用sub1 $ size包含1234.但500(!!)所以你不要编辑这个值! 你可以传递两个或更多的值并在子程序中改变它们,所有的值都会被改变! 我从来没有见过这种效果。 我见过的程序也只允许@_数组。 只有你可以安全地传递variables不要改变内部子程序你必须这样做:
sub sub2{ my @m=@_; .... }
将@_分配给本地子程序过程variables,然后使用它们。 同样在一些深度recursionalgorithm中,你可以使用这种方法来减less用于局部variables的内存。 只有返回@_数组相同。