print和三元条件运算符之间的奇怪交互



遇到print和三元条件运算符之间的奇怪交互,我不理解。如果我们这样做…:

print 'foo, ' . (1 ? 'yes' : 'no') . ' bar';

然后我们得到输出…:

foo, yes bar

正如我们所期望的那样。然而,如果我们这样做…:

print (1 ? 'yes' : 'no') . ' bar';

那么我们只得到输出…:

yes

为什么在第二种情况下不将"bar"附加到输出中?

让我们这样做吧,但实际上——也就是说,上有警告

perl -we'print (1 ? "yes" : "no") . " bar"'

它打印

print(…(被解释为-e行1处的函数。在-e第1行的void上下文中无用地使用了串联(.(或字符串。是

(但末尾没有换行符(

因此,由于(1 ? "yes" : "no")被视为print函数的参数列表,因此三进制被求值为yes,这是print的参数,因此,单独打印。由于这是一个已知的"gotcha",很容易出错,我们收到了警告

然后串接字符串" bar"(到print的返回值,即1(,这在void上下文中是没有意义的,因此我们也会得到警告。

一种解决方法是预先准备+,强制将()解释为表达式

perl -we'print +(1 ? "yes" : "no") . " bar", "n"'

或者,正确地调用print作为函数,带有全括号

perl -we'print( (1 ? "yes" : "no") . " bar", "n" )'

在这两种情况下我都添加了换行符。

有关相关示例和精确文档链接的详细讨论,请参阅本文。

如果函数名后的第一个非空白字符是左括号,则Perl将其解释为函数参数列表的开始,匹配的右括号将用作参数列表的结束。这是use warnings将向您介绍的内容之一。

通常的解决方法是在左括号前插入一个+

$ perl -e "print (1 ? 'yes' : 'no') . ' bar'"
yes
$ perl -e "print +(1 ? 'yes' : 'no') . ' bar'"
yes bar

最新更新