$a,$b,$c = 1,2,3;
print "$a, $b, $c\n";
返回
, , 1
所以=(等于)的优先级高于元组结构 - 这样做吗?
$a,$b,($c=1),2,3;
答案 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
强制标量上下文,返回列表中元素的数量。