Perl将引用分配给子例程

时间:2018-11-02 02:49:35

标签: perl

我在子例程中使用@_来获取一个参数,该参数被分配为数组的引用,但结果并未显示为数组引用。

我的代码在下面。

my @aar = (9,8,7,6,5);

my $ref = \@aar;

AAR($ref);

sub AAR {
   my $ref = @_;
   print "ref = $ref";
}

这将打印1,而不是数组引用,但是如果我将@_替换为shift,则打印结果将是引用。

谁能解释为什么我无法使用@_获得引用?

2 个答案:

答案 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});