很多人都有準備在這裏得到正確答案。我想添加一個我發現照亮的例子。您可以閱讀perldoc perlref中的文檔以獲取更多信息。
您的問題是含糊之一,您有兩個操作$$
和[0]
工作在相同的標識符_
,並且結果取決於首先執行哪個操作。我們可以通過使用支持花括號${ ... }
來減少歧義。 $$_[0]
可以(反正人)可能意味着:
${$$_}[0]
- 取消引用標$_
,然後取它的第一個元素。
${$_[0]}
- 取數組@_
的元素0
並將其解引用。
如您所見,這兩種情況指的是完全不同的變量,即@_
和$_
。
當然,Perl的它一點也不含糊,我們只是得到了第一個選項,因爲之前鍵查找,進行提領。我們需要支持大括號覆蓋此非關聯化,這就是爲什麼你的例子並不「工作」不支持括號。
你可能會考慮爲你的子程序一個稍微不那麼混亂的功能。不要試圖同時做兩件事情(獲取參數,並取消對它的引用),你可以做兩個階段:
sub foo {
my $n = shift;
print $$n;
}
在這裏,我們起飛@_
第一個參數與shift
,然後取消對它的引用。清潔和簡單。
大多數情況下,你將不會被使用標量變量的引用,但是。在這些情況下,您可以使用箭頭操作符->
my @array = (1,2,3);
foo(\@array);
sub foo {
my $aref = shift;
print $aref->[0];
}
我發現使用箭頭操作符是最好的$$
語法。
來源
2013-10-18 13:36:18
TLP