Perl5 =(等于)运算符优先级

时间:2011-05-14 08:46:55

标签: perl equals operator-precedence

 $a,$b,$c = 1,2,3;
 print "$a, $b, $c\n";

返回

 , , 1

所以=(等于)的优先级高于元组结构 - 这样做吗?

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

2 个答案:

答案 0 :(得分:8)

是。 precedence table中有一个perlop。赋值运算符为19级,逗号为20级。通常,Perl的运算符与相应的C运算符具有相同的优先级(对于具有相应C运算符的运算符)。

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

答案 1 :(得分: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的优先级问题),以及标量上下文中列表的值(强制为RHS的RHS)标量上下文中的and是它拥有的元素数(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强制标量上下文,返回列表中元素的数量。