2011-05-14 92 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力标量上下文,返回列表中的元素的数量。