Perl一行if语句

时间:2012-03-14 21:25:50

标签: perl if-statement

我有一个声明

$set eq "Y" ? $set = "N" : $set = "Y";

但无论它总是设置为"N"

# Toggle setting
if ($set eq "Y")
{
   $set = "N";
}
else
{
   $set = "Y";
}

为什么一个衬垫似乎不起作用?

5 个答案:

答案 0 :(得分:26)

由于优先级规则,perl不会按您的意思解析您的语句:

$ perl -MO=Deparse,-p -e '$set eq "Y" ? $set = "N" : $set = "Y"'
((($set eq 'Y') ? ($set = 'N') : $set) = 'Y');
-e syntax OK

如您所见,在这两种情况下,最终结果都是$set标量,然后设置为Y

您可以使用几个parens修复它:

$set eq "Y" ? $set = "N" : ($set = "Y")

但为什么要重复这项任务:

$set = $set eq 'Y' ? 'N' : 'Y';

答案 1 :(得分:8)

运营商优先权。你写的相当于

($set eq "Y" ? $set = "N" : $set) = "Y";

如果你坚持编写这样简洁的代码,那就更有意义了:

$set = ( $set eq "Y" ? "N" : "Y" );

答案 2 :(得分:7)

$set = ($set eq "Y") ? "N" : "Y";

应该有效

答案 3 :(得分:5)

这是优先权;让我们用括号做意图,然后让Perl再次删除它们:

perl -MO=Deparse -e '($set eq "Y") ? ($set = "N") : ($set = "Y"); print $set'
$set eq 'Y' ? $set = 'N' : ($set = 'Y');
print $set;
-e syntax OK

因此,您需要按照预期进行括号。

答案 4 :(得分:4)

如果您不想使用" C"样式条件语句,你可以用2行做同样的事情:

my $set = "Y"; #Set the scope and default value
$set = "N" if ($set eq "Y");

我个人推荐" C"上面其他人描述的风格......它很容易证明变量可以是两个选项。

然而,在处理单个条件结果时,我展示的方法很棒。