perl:为什么\(1,2)是SCALAR?如何解除引用呢?

时间:2013-05-03 19:16:20

标签: perl

以下是代码:

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

它给了我:

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

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

2 个答案:

答案 0 :(得分:7)

你想要的是这个:

$ref = [ 1, 2 ];

在您的代码中:

$ref = \(1,2);

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

$ref = ( \1, \2 );

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

请参阅perldoc perlref

请注意,此行为对于非文字值也是一致的,例如子例程调用。如果你打电话给这样的子:

$val = function();

然后在标量上下文中调用function子,并且可以选择返回与在列表上下文中调用的值不同的值。 (参见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

答案 1 :(得分:2)

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

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

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

列表和数组是截然不同的:列表是语法构造,而数组是数据结构