在语句中分配变量时,perl中的三元运算符会产生意外结果

ion*_*ish 0 php perl if-statement function

我正在尝试从php转换到perl,并且预计会遇到一些奇怪的现象.我无法理解为什么我的代码的一个版本与另一个版本有效.

这失败了:

sub tester
{
$return;
($_[0] < 10) ? $return = "youre a youngin" : $return = "youre an old person";
return $return;
}


print "how old are you?";
$a = <>;
chomp $a;

print  tester($a);  #both result in "youre an old person"
Run Code Online (Sandbox Code Playgroud)

但是这个有效:

sub tester
{
    return ($_[0] < 10) ? "youre a youngin" : "youre an old person";
}


print "how old are you?";
$a = <>;
chomp $a;
print  tester($a);
Run Code Online (Sandbox Code Playgroud)

这里有什么真正的区别?!

Min*_*ang 11

它与Perl的运算符优先级有关.在Perl,

($_[0] < 10) ? $return = "youre a youngin" : $return = "youre an old fart";
Run Code Online (Sandbox Code Playgroud)

和...一样

( ($_[0] < 10) ? $return = "youre a youngin" : $return ) = "youre an old fart";
Run Code Online (Sandbox Code Playgroud)

请注意帕伦与FRONT绑定.

这导致了Perl的另一个令人困惑的特性:条件左值:你可以这样做 (CONDITION ? $ASSIGN_A_IF_CONDITION_IS_TRUE : $ASSIGN_B_IF_CONDITION_IS_FALSE) = 2

这是一个修复

($_[0] < 10) ? ($return = "youre a youngin") : ($return = "youre an old fart");
Run Code Online (Sandbox Code Playgroud)

http://codepad.org/MxBAy7wy

编辑:

但是,大多数人都会写

$return = ($_[0] < 10) ? "youre a youngin" : "youre an old fart";
Run Code Online (Sandbox Code Playgroud)

,节省了两次输入变量的冗余.

根据Perl和PHP文档,Perl ?:是右关联的,PHP ?:是左关联的.(http://perldoc.perl.org/perlop.html)(http://php.net/manual/en/language.operators.precedence.php)

  • 我对Perl一无所知,但肯定它支持一些更典型的东西,比如`$ return =(cond?a:b)`而不是`cond?($ return = a):( $ return = b)`? (5认同)
  • 您可以让Perl向您显示B :: Deparse的优先级.使用`perl -MO = Deparse,-p whatever.pl`运行程序,它将显示包含隐含括号的代码. (3认同)