2011-07-14 32 views
1

這是Devel :: REPL會話(我的Perl版本是v5.10.1)。你能解釋一下結果嗎?圓括號如何在Perl 5中工作?

0:main$ my $x = 1,2,4 
[ 
    1, 
    2, 
    4 
] 

0:main$ my $y = (1,2,4) 
Useless use of a constant in void context at (eval 296) line 8. 
4 

我剛剛開始學習Perl,並且仍然遇到了煩惱上下文的麻煩。無論如何,我認爲我明白爲什麼第二項任務會做它的工作。這是因爲我們有了一個標量上下文,這就是爲什麼沒有構建任何列表,我們只是最終重複執行逗號操作符,而操作符只是返回它的右操作數。對?

但是,第一項任務有什麼問題?它不應該等同於第二個嗎?在某些時候,我認爲圓括號不會提供任何魔法語義來構建列表 - 它們只是將元素分組在一起,並且如果元素最終在列表上下文中使用,它們只會被轉換爲列表。顯然,這不是事實。

好吧,好的。圓括號的特殊作用是什麼?

回答

6

Devel::REPL正在評估在列表環境每個輸入行,然後打印結果的列表我打賭。這樣有效地將第一行是這樣的:

say join ', ' => do {my $x = 1, 2, 4} 

其被解析爲:

say join ', ' => do {(my $x = 1), (2), (4)} 

這樣一來,REPL打印 「1,2,4」,因爲它從do塊接收3個值。

第二行是:

say join ', ' => do {my $x = (1, 2, 4)} 

其被解析爲:

say join ', ' => do {(my $x = scalar(1, 2, 4))} 

在標量上下文列表返回它的最後一個元素,其被分配給$x然後返回由do塊,隨後打印「4」。

+0

我想我現在明白了。 – mob

+0

非常感謝,就是這樣!隨後'說$ x'確實打印'1'。 –

5

我覺得第一條語句的行爲是Devel::REPL的結果,但我不把它提供給我的那一刻,以測試這個假設。

Perl中的圓括號主要調整優先級。他們還可以調整解析器如何看待某些語句,但這不是這種情況。該=具有比,一個更高的優先級,所以在第一條語句,如果Devel::REPL評估在列表環境陳述,被解析爲一個列表,其中第一元素是1至$x和所述第二和第三值是2的分配結果和4.在第二優先級已經改變並且作爲結果上下文已經改變,使得,是在標量上下文和4被分配給$x

$ perl -MO=Deparse,-p -e 'my $x = 1,2,4' 
((my $x = 1), '???', '???'); 
-e syntax OK 

$ perl -MO=Deparse,-p -e 'my $x = (1,2,4)' 
(my $x = ('???', '???', 4)); 
-e syntax OK 

如果在Devel::REPLscalar(my $x = 1,2,4)其結果將是圖4和$x將等於1。

+0

謝謝!我希望我能把埃裏克和你的答覆都標記出來。特別感謝Deparse! –

相關問題