Perl一行if语句

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)


Kei*_*son 9

运算符优先级.你写的相当于

($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)


Dav*_*ris 7

$set = ($set eq "Y") ? "N" : "Y";
Run Code Online (Sandbox Code Playgroud)

应该管用


jør*_*sen 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
Run Code Online (Sandbox Code Playgroud)

这就是你想要做的括号.