考虑:
sub abc()
{
}
abc(@array, $a);
我如何访问@array
和$a
子程序abc()
?
我知道$_[0]
and $_[1]
,但我不确定是否可以将它用于数组。
考虑:
sub abc()
{
}
abc(@array, $a);
我如何访问@array
和$a
子程序abc()
?
我知道$_[0]
and $_[1]
,但我不确定是否可以将它用于数组。
@_
您可以使用数组访问 sub 的参数。第一个参数是$_[0]
,第二个 -$_[1]
等。在这种特殊情况下,您的数组将展开到其元素列表,所以$_[0]
is $array[0]
,$_[1]
is$array[1]
然后在所有这些元素之后,最后一个元素 of@_
将是 的值$a
。
如果您想避免在列表上下文中使用数组时总是发生展开,请改用对数组的引用。对数组和哈希的引用是使用\
. 所以调用你的函数,如:
abc(\@array, $a);
之后,$_[0]
将有参考@array
和$_[1]
将是$a
。要通过引用访问数组元素,请使用->
运算符。$_[0]->[2]
与 相同$array[2]
。->
实际上,只要它在括号之间,您甚至可以删除,所以$_[0][2]
也可以。请参阅perlref中有关参考的更多详细信息。
你有两个选择:
首先传递标量变量(肮脏的方式)
abc($a, @array);
然后接收子程序中的参数为
my ($a, @array) = @_;
通过在数组变量之前添加反斜杠将数组作为引用传递(推荐)
abc(\@array, $a);
然后接收子程序中的参数为
my ($array_ref, $a) = @_;
并取消引用 $array_ref
my @array = @$array_ref;
有关perlref的更多信息。
其他答案解释了两种基本方法。但是,重要的是要注意两者之间有很大的区别:当您通过引用传递数组时,您对其所做的任何更改也会更改原始数组。这是一个例子:
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 中所做的更改影响原始数组,则制作一个引用数组的副本。
如果您传递数组引用而不是 Oleg V. Volkov 提到的数组,那就太好了
sub abc()
{
my ( $array, $a ) = @_; #receiving the paramters
my @arr = @{$array}; # dereferencing the array
}
abc(\@array,$a);