我在Perl中做了一些工作,我使用条件运算符跑了一个奇怪的结果。
有问题的代码:
($foo eq "blah") ? @x = @somearray : @y = ("another","array");
尝试编译此代码会导致错误“Assignment to both a list and a scalar at XXX line YY, near ');'
”。在尝试查明错误的来源时,我使用几种不同的方式在Perl中表示数组,并且它们都返回相同的错误。现在起初我认为这只是一些明显错误的赋值语句,但为了满足我的好奇心,我用更冗长的方式重写了语句:
if($foo eq "blah") {
@x = @somearray;
} else {
@y = ("another","array");
}
该版本的代码编译得非常好。
条件运算符的工作方式和基本的if-else语句之间是否存在一些细微的区别?我总是将条件运算符理解为第二个语句的简写版本。如果两者之间没有功能差异,为什么Perl会反对第一个语句,而不是第二个语句?
答案 0 :(得分:15)
$ perl -MO=Deparse -e'($foo eq "blah") ? @x = @somearray : @y = ("another","array");' Assignment to both a list and a scalar at -e line 1, near ");" -e had compilation errors. $foo eq 'blah' ? (@x = @somearray) : @y = ('another', 'array'); $ perl -MO=Deparse -e'($foo eq "blah") ? @x = @somearray : (@y = ("another","array"));' $foo eq 'blah' ? (@x = @somearray) : (@y = ('another', 'array')); -e syntax OK
注意括号:?:
比=
更紧密。
答案 1 :(得分:9)
Perl条件运算符应该是
$ variable =(表达式)? true assignment:false assignment;
你正在做的事情看起来应该有效,并且与if / else语句基本相同。但与常规有所不同,有问题。
答案 2 :(得分:7)
perlop文档明确指出你应该在赋值运算符周围加上括号。
如果您不理解运算符优先级,则不能使用括号是您自己的支柱。不要为了自己的利益而过于聪明!
答案 3 :(得分:6)
这与你的问题有些正交,但它指出:Perl的条件运算符将上下文从第一个参数传播到第二个或第三个参数,所以这会给你带来不希望的结果:
$x = ($foo eq "blah") ? $somevalue : ("another","array");
如果条件为假,则$x
将被赋予单个整数值2
(第三个参数中的元素数)。
另一方面,如果您试图执行纯粹的标量分配:
# this is wrong, for the same order-of-operations reasons as with arrays
($foo eq "blah") ? $x = $somevalue : $x = "another value";
这是解决问题的合理(也是最佳)方式:
$x = ($foo eq "blah") ? $somevalue : "another value";
同样,您可以通过以下方式优化原始代码:
@x = ($foo eq "blah") ? @somearray : ("another","array");
答案 4 :(得分:2)
这将是使用较低优先级'和'以及'或'运算符的好地方。
$foo eq 'blah' and @x = @somearray or @y = ('another', 'array');
如果您确定@x = @somearray将永远为真。或者你可以翻转它们。