以下是代码:
$ref = \(1,2);
print "$ref\n";
print "@$ref\n";
它给了我:
SCALAR(0xa15a68)
Not an ARRAY reference at ./test.pl line 23.
我试图编写一个包装函数来调用一个结果类型未知的函数 它应该调用实际函数,保存结果,做一些其他的东西并返回保存的结果。但事实证明,对于期望标量值的调用者,返回数组并在括号中返回列表是不同的事情。这就是我尝试使用引用的原因。
答案 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
列表和数组是截然不同的:列表是语法构造,而数组是数据结构。