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

Perl5=(等于)运算符优先级,perl,equals,operator-precedence,Perl,Equals,Operator Precedence,返回 $a,$b,$c = 1,2,3; print "$a, $b, $c\n"; 那么=(equals)是否比元组构造具有更高的优先级-这样做 , , 1 对。有一个在里面。赋值运算符为级别19,逗号为级别20。通常,Perl的运算符与相应的C运算符具有相同的优先级(对于具有相应C运算符的运算符) 如果你的意思是($a,$b,$c)=(1,2,3)必须使用参数。在标量上下文中使用的逗号运算符不用于元组构造,而是用于计算多个表达式并返回最后一个表达式 Perl根据上下文做不同的事情,

返回

 $a,$b,$c = 1,2,3;
 print "$a, $b, $c\n";
那么=(equals)是否比元组构造具有更高的优先级-这样做

 , , 1
对。有一个在里面。赋值运算符为级别19,逗号为级别20。通常,Perl的运算符与相应的C运算符具有相同的优先级(对于具有相应C运算符的运算符)


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

在标量上下文中使用的逗号运算符不用于元组构造,而是用于计算多个表达式并返回最后一个表达式

Perl根据上下文做不同的事情,它根据是否需要一个标量值、一个列表、什么都没有……来决定做什么。。。请参阅以获取介绍

因此,如果你这样做:

 $a,$b,($c=1),2,3;
您将得到
0
,因为
4,2,0
是在标量上下文中计算的,其行为类似于C的逗号运算符,在逗号之间计算表达式并返回最后一个表达式的结果

如果强制在列表上下文中计算
4,2,0

perl -e '$a = (1 and 4,2,0); print"$a\n"'
您会得到
3
,因为分配给数组会强制列表上下文(附加括号用于解决前面提到的优先问题cjm),而标量上下文中列表的值(通过标量上下文中
的RHS强制)是它拥有的元素数(Perl中的logical
返回最后计算的表达式,而不是其他编程语言中的布尔值)

因此,正如cjm所说,您需要:

perl -e '$a = (1 and @a=(4,2,0)); print"$a\n"'
处理优先级和强制列表上下文

请注意以下两者之间的区别:

($a,$b,$c) = (1,2,3);
逗号运算符在标量上下文中求值,并返回8

$ perl -e '$a,$b,$c = (7,6,8); print "$a $b $c\n"'
8
逗号运算符在列表上下文中求值,并返回一个列表

$ perl -e '($a,$b,$c) = (7,6,8); print "$a $b $c\n"'
7 6 8
逗号运算符在列表上下文中求值,返回一个列表,然后对
$c
的赋值强制标量上下文,返回列表中的元素数

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