2

这是代码:

$ref = \(1,2);
print "$ref\n";
print "@$ref\n";

它给了我:

SCALAR(0xa15a68)
Not an ARRAY reference at ./test.pl line 23.

我试图编写一个调用结果类型未知的函数的包装函数。
它应该调用真正的函数,保存结果,做一些其他的事情并返回保存的结果。但事实证明,对于期望标量值的调用者,返回数组和返回括号中的列表是不同的事情。这就是我尝试使用引用的原因。

4

2 回答 2

7

你想要的是这样的:

$ref = [ 1, 2 ];

在您的代码中:

$ref = \(1,2);

右侧所做的是创建引用列表,而不是对数组的引用。与此相同:

$ref = ( \1, \2 );

由于您将该列表分配给标量,因此除了最后一项之外的所有项目都被丢弃,并 $ref设置为对标量值 2 的引用,这可能不是您想要的。

perldoc perlref

请注意,这种行为对于非文字值也是一致的,例如子例程调用。如果你像这样调用一个子:

$val = function();

然后functionsub 在标量上下文中调用,并且可以选择返回与在列表上下文中调用不同的值。(请参阅perldoc -f wantarray。)如果它仍然选择返回一个列表,则除了列表的最后一个元素之外的所有元素都将被丢弃,并且最后一个元素将分配给$val

sub fun1() { return 1; }
sub fun2() { return (1,2); }
my $f1 = fun1();
my $f2 = fun2();
# $f1 is 1, and $f2 is 2

my $r1 = \( fun1() );
my $r2 = \( fun2() );
# $r1 is a ref to 1, and $r2 is a ref to 2
于 2013-05-03T19:18:18.927 回答
2

一元引用运算符\返回其 RHS 参数的引用。如果该参数是list,则返回引用列表。

如果在标量上下文中使用列表,则返回该列表的最后一个元素:

1, 2           # list of 1, 2
\(1, 2)        # list of \1, \2
$ref = \(1, 2) # list is used in scalar context
$ref = \2      # equivalent

列表和数组是不同的:列表是一种语法结构,而数组是一种数据结构

于 2013-05-03T19:21:46.857 回答