2013-05-03 76 views
2

下面的代碼:perl:爲什麼(1,2)是標量?如何解除引用?

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

它給我:

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

我嘗試編寫調用與未知的結果類型的函數的包裝功能。
它應該調用真正的功能,保存結果,做一些其他的東西,並返回保存的結果。但事實證明,對於需要標量值的調用者來說,返回數組並返回括號中的列表是不同的事情。這就是爲什麼我試圖使用參考。

+1

您想確定調用者的上下文並使用相同的上下文調用基礎函數。見[wantarray](http://perldoc.perl.org/functions/wantarray.html)。 – pilcrow 2013-05-03 19:30:01

回答

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 

列表和數組是不同的:列表是一個句法構建體,而一個陣列是數據結構

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 
+0

但實際函數返回(1,2)。我無法改變它。 – basin 2013-05-03 19:19:33

+3

真正的函數返回列表(1,2),而不是一些文字句法。如果你在'['...']'中包裝一個列表,你會得到一個數組的引用。所以'$ ref = [real_function()];'會工作。 – 2013-05-03 19:21:16

+0

@MarkReed它會工作,如果你刪除該分號,無論如何:) – hobbs 2013-05-03 19:22:58

相關問題