奇数Perl条件运算符行为

时间:2009-11-12 20:33:33

标签: perl conditional-operator if-statement

我在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会反对第一个语句,而不是第二个语句?

5 个答案:

答案 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将永远为真。或者你可以翻转它们。