考虑:
sub abc()
{
}
abc(@array, $a);
如何在子例程@array
中访问$a
和abc()
?
我知道$_[0]
和$_[1]
,但我不确定是否可以将它用于数组。
答案 0 :(得分:6)
使用@_
数组访问子参数。第一个参数是$_[0]
,第二个参数是$_[1]
等。在这种特殊情况下,您的数组将展开为其元素列表,因此$_[0]
为$array[0]
, $_[1]
为$array[1]
,然后在所有这些元素之后,@_
的最后一个元素将是$a
的值。
如果要避免在列表上下文中使用数组时始终发生展开,请改为使用对数组的引用。使用\
创建对数组和哈希的引用。所以请调用您的函数:
abc(\@array, $a);
之后,$_[0]
将引用@array
,$_[1]
将引用$a
。要通过引用访问数组元素,请使用->
运算符。 $_[0]->[2]
与$array[2]
相同。实际上你甚至可以放弃->
,只要它在括号之间,所以$_[0][2]
也可以。请参阅perlref中有关参考文献的详细信息。
答案 1 :(得分:6)
您有两种选择:
首先传递标量变量(脏路)
abc($a, @array);
然后在子程序中接收参数
my ($a, @array) = @_;
通过在数组变量(推荐)
之前添加反斜杠将数组作为参考传递abc(\@array, $a);
然后在子程序中接收参数
my ($array_ref, $a) = @_;
取消引用$ array_ref
my @array = @$array_ref;
有关perlref的更多信息。
答案 2 :(得分:2)
其他答案解释了两种基本方法。但是,重要的是要注意两者之间存在很大差异:当您通过引用传递数组时,您对其进行的任何更改也会更改原始数组。这是一个例子:
use warnings;
use strict;
my @array = (1, 2, 3, 4, 5);
sub by_ref
{
my $array_ref = $_[0];
@$array_ref = (0, 0, 0);
print "Array inside by_ref: @$array_ref\n";
}
sub by_val
{
my @array_copy = @_;
@array_copy = (0,0,0);
print "Array inside by_val: @array_copy\n";
}
by_val(@array);
print "Original array after calling by_val: @array\n";
by_ref(\@array);
print "Original array after calling by_ref: @array\n";
如果您通过引用传递,则需要记住此行为,如果您不希望在sub中进行更改以影响原始数据,则制作引用数组的副本。
答案 3 :(得分:0)
如果你传递数组引用而不是像Oleg V. Volkov所提到的数组那样会很好
sub abc()
{
my ( $array, $a ) = @_; #receiving the paramters
my @arr = @{$array}; # dereferencing the array
}
abc(\@array,$a);