子程序调用之前的反斜杠

时间:2015-06-04 10:50:29

标签: perl reference subroutine

当我理解引用中[]和\之间的区别时,我在子程序中使用了两者,前者很好,但是当我稍后尝试时我认为它应该给出错误,但下面的程序在perl中

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @b;
for my $i ( 0 .. 10 ) {
    $b[$i] = \somefunc($i);

}
print Dumper( \@b );

sub somefunc {
    my $n = shift;
    my ( @a, $k );
    for my $j ( 11 .. 13 ) {
        $k = $n * $j;
        push( @a, $k );
    }
    print "a: @a \n";
    return @a;
}

将输出显示为:

a: 0 0 0 
a: 11 12 13 
a: 22 24 26 
a: 33 36 39 
a: 44 48 52 
a: 55 60 65 
a: 66 72 78 
a: 77 84 91 
a: 88 96 104 
a: 99 108 117 
a: 110 120 130 
$VAR1 = [
      \0,
      \13,
      \26,
      \39,
      \52,
      \65,
      \78,
      \91,
      \104,
      \117,
      \130
    ];

我无法理解输出。需要解释。

1 个答案:

答案 0 :(得分:2)

这里发生的事情是:

您正在从somefunc返回一个数组。

但是你将它分配给标量。这是有效所做的,只是将数组中的最后一个值放入标量值。

my $value =  ( 110, 120, 130 );
print $value;

执行此操作时 - $ value设置为数组中的最后一个值。这就是您的代码中实际发生的事情。请参阅示例perldata

  

列表值通过用逗号分隔各个值来表示(并将列表括在括号中,其中优先级需要它):     (LIST)

     

在不需要列表值的上下文中,看起来像列表文字的值只是最终元素的值,就像C逗号运算符一样。例如,

     

@foo = ('cc', '-E', $bar);

     

将整个列表值分配给数组@foo,但

     

foo = ('cc', '-E', $bar);

     

将变量$ bar的值赋给标量变量$ foo。请注意,标量上下文中实际数组的值是数组的长度;以下将值3分配给$ foo:

     

@foo = ('cc', '-E', $bar);      $foo = @foo; # $foo gets 3

后一种情况通常是陷阱,因为它是标量上下文中的列表。

在你的例子中 - 反斜杠前缀表示'引用' - 这在很大程度上是没有意义的,因为它是对数字的引用。

但是对于标量,它可能更有意义:

my $newvalue = "fish"; 
my $value =  ( 110, 120, 130, \$newvalue );
print Dumper $value;

$newvalue = 'barg'; 
print Dumper $value;

给出:

$VAR1 = \'fish';
$VAR1 = \'barg';

这就是你获得结果的原因。带斜杠的前缀表示您获得了对结果的引用,而不是对sub的引用。对130的引用实际上并没有那么有意义。

通常,在执行上述任务时 - 您会收到有关Useless use of a constant (110) in void context的警告,但是当您有子程序返回时,这不适用。

如果要插入 sub 引用,则需要添加&,但如果您只想通过引用插入返回的数组 - 则需要:< / p>

$b[$i] = [somefunc($i)]

或者:

return \@a;