我在子例程中使用@_来获取一个参数,该参数被分配为数组的引用,但结果并未显示为数组引用。
我的代码在下面。
my @aar = (9,8,7,6,5);
my $ref = \@aar;
AAR($ref);
sub AAR {
my $ref = @_;
print "ref = $ref";
}
这将打印1,而不是数组引用,但是如果我将@_替换为shift,则打印结果将是引用。
谁能解释为什么我无法使用@_获得引用?
答案 0 :(得分:6)
这在Perl中约为context。这是该语言的重要方面。
带有类似
的表达式my $var = @ary;
您正在尝试将数组分配给标量。
这是没有意义的,发生的是,右侧评估了数组的元素数量,并且将分配给了$var
。
为了更改该行为,您需要向赋值运算符提供“列表上下文”。在这种情况下,你会
my ($var) = @ary;
,现在我们将一个列表(数组元素)分配给一个列表(变量,这里$var
),在列表中一对一地分配它们。因此,这里@ary
的第一个元素被分配给$var
。请注意,该语句与“列表”的难以理解的概念不符。
因此,根据您的需要
my ($ref) = @_;
,并且根据需要将@_
中的第一个元素分配给$ref
。
或者,您可以使用shift删除并返回@_
的第一个元素,在这种情况下,标量上下文分配是按顺序进行的
my $ref = shift @_;
在这种情况下,您也可以这样做
my $ref = shift;
默认情况下,由于shift
在@_
上有效。
当您要在分配输入时删除输入的第一个元素,以使其余的@_
非常适合进行进一步处理时,这非常适合。这在面向对象的代码中最有用。
答案 1 :(得分:1)
将数组分配给标量时,您将获得数组的大小。您将一个参数(对数组的引用)传递给AAR
,这就是为什么得到1的原因。
要获取实际参数,请将局部变量放在花括号中:
sub AAR {
my ($ref) = @_;
print "ref = $ref\n";
}
这将打印类似ref = ARRAY(0x5566c89a4710)
的内容。
然后您可以使用引用来访问数组元素,如下所示:
print join(", ", @{$ref});