2016-11-25 31 views
1

以下打印語句是在訪問所述陣列的所述第一元件有效參考在這種情況下在Perl中花括號的作用是什麼?

my $aref = [6, 7, 8]; 
print $aref->[0]; 
print $$aref[0]; 
print ${$aref}[0]; 

什麼是用於允許/使用大括號中的第三打印的原因嗎?它是通過設計還是偶然的工作?

+0

http://perlmonks.org/?node=References+quick+reference – ysth

回答

6

原因是大括號內的表達式可以任意複雜。想象一下,例如,你有一個對象的方法返回了一個數組引用的列表 - 並且你想使用該列表中的第二個引用。然後你可以使用下面的代碼:

print ${ ($obj->array_generator)[1] }[0]; 

在花括號裏面你可以使用任何返回數組引用的表達式。只有在簡單的情況下(表達式是一個簡單的標量變量),您可以省略大括號。

當然,使用這種語法來查找引用數組中的元素很少是一個好主意 - 我總是推薦使用箭頭語法。

print +($obj->array_generator)[1]->[0]; 

更新:東西忘了原先提 - 的表達必須在大括號,因爲它是一個返回的數組引用的代碼塊。它不一定是一個單一的表達。你可以(但可能是不應該!)像這樣寫代碼:

print ${ 
    my @arefs = $object->array_generator; 
    my $aref = $arefs[1]; 
    $aref; 
}[0]; 
+0

我覺得使用大括號來達到上面的效果是不完整的;我認爲,像其他一些語言一樣,使用括號會更「自然」;但是這是不可能的,因爲$(已經是一個內置的變量)在你的上面的「print +(...」的例子中,將它替換爲「print + {...」仍然有效嗎?我發現我的頭不必要地不得不考慮通過哪種形式的「分組」(賦予優先級)(圓括號或大括號) – Ltf4an

+3

它必須是大括號,因爲它實際上是一段代碼,不能替換'+(' '+ {'因爲這是一個列表切片,並且列表是用'(...)'構造的。 –

+0

您對「代碼塊」這個術語的引用有助於消除我的困惑,我一直在考慮花括號「分組」,而它應該被看作是一個「塊」結構。 – Ltf4an

2

$BLOCK[EXPR]允許${ get_ref() }[0]你可以做get_ref()->[0]之前。


我認爲(首選)箭頭符號語法($EXPR->[EXPR])比內聯語法更新。對於數組元素解引用內聯語法如下:

$BLOCK[EXPR] 

這允許

${ get_ref() }[0] # And even more complex blocks, including one with multiple statements. 

然而,爲了方便,

${ $ref }[EXPR]  # BLOCK contains a simple scalar 

可縮短至

$$ref[EXPR] 

Dereferencing Syntax

相關問題