2011-05-14 156 views

回答

8

是。有一個在perlop一個precedence table。賦值運算符是19級,並且逗號是20水平通常,Perl的運營商有相同的優先級相應的C運營商(對於那些具有一個相應的C運營商運營商)。

如果你的意思是你($a,$b,$c) = (1,2,3);必須使用括號。

2

,你用它逗號操作符(在標量上下文)不是元組建築,它是在評估了幾個表達式並返回最後一個。

Perl根據上下文做了不同的事情,它根據預期的標量值,列表,什麼都沒有做,決定要做什麼,請參閱perldoc perldata's section on Context的介紹。

所以,如果你這樣做:

perl -e '$a = (1 and 4,2,0); print"$a\n"' 

你得到0,因爲4,2,0在標量環境,其行爲類似於C的逗號操作,評估逗號和返回的最後一個結果之間的表達式。

如果強制4,2,0在列表環境進行評估:

perl -e '$a = (1 and @a=(4,2,0)); print"$a\n"' 

你得到3,因爲指派給磁盤陣列勢力列表上下文(附加括號是有沒有辦法解決所提到的優先發布CJM),和在標量上下文列表的值(通過被在標量上下文的and的RHS被迫)是它具有的元件(在Perl邏輯and返回最後計算的表達式,而不是一個布爾值如在其他的編程語言)的數量。

所以,CJM說,你需要做的:

($a,$b,$c) = (1,2,3); 

處理優先和強制列表上下文。

通知的區別:

$ perl -e '$a,$b,$c = (7,6,8); print "$a $b $c\n"' 
8 

在標量上下文逗號操作符進行評價,並返回8.

$ perl -e '($a,$b,$c) = (7,6,8); print "$a $b $c\n"' 
7 6 8 

逗號操作符是在列表環境評估,並且返回一個列表。

$ perl -e '$a,$b,$c =() = (7,6,8); print "$a $b $c\n"' 
3 

逗號操作符在列表上下文中計算,返回一個列表,然後分配給$c力標量上下文,返回列表中的元素的數量。