Eri*_*sum 12 perl if-statement
我有一个声明
$set eq "Y" ? $set = "N" : $set = "Y";
Run Code Online (Sandbox Code Playgroud)
但无论它总是如何设定 "N"
# Toggle setting
if ($set eq "Y")
{
$set = "N";
}
else
{
$set = "Y";
}
Run Code Online (Sandbox Code Playgroud)
为什么一个班轮看起来不起作用?
Eri*_*rom 26
由于优先级规则,perl不会像你想象的那样解析你的语句:
$ perl -MO=Deparse,-p -e '$set eq "Y" ? $set = "N" : $set = "Y"'
((($set eq 'Y') ? ($set = 'N') : $set) = 'Y');
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
如您所见,在这两种情况下,最终结果都是$set标量,然后将其设置为Y.
你可以用几个parens修复它:
$set eq "Y" ? $set = "N" : ($set = "Y")
Run Code Online (Sandbox Code Playgroud)
但为什么重复这个任务:
$set = $set eq 'Y' ? 'N' : 'Y';
Run Code Online (Sandbox Code Playgroud)
运算符优先级.你写的相当于
($set eq "Y" ? $set = "N" : $set) = "Y";
Run Code Online (Sandbox Code Playgroud)
如果你坚持编写这样简洁的代码,这更有意义:
$set = ( $set eq "Y" ? "N" : "Y" );
Run Code Online (Sandbox Code Playgroud)
这是优先权; 让我们用括号做意图,然后让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
Run Code Online (Sandbox Code Playgroud)
这就是你想要做的括号.