当我理解引用中[]和\之间的区别时,我在子程序中使用了两者,前者很好,但是当我稍后尝试时我认为它应该给出错误,但下面的程序在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
];
我无法理解输出。需要解释。
答案 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;