我有一个声明
$set eq "Y" ? $set = "N" : $set = "Y";
但无论它总是设置为"N"
# Toggle setting
if ($set eq "Y")
{
$set = "N";
}
else
{
$set = "Y";
}
为什么一个衬垫似乎不起作用?
答案 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"上面其他人描述的风格......它很容易证明变量可以是两个选项。
然而,在处理单个条件结果时,我展示的方法很棒。