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

Win*_*ght 1 perl expression function

遇到print了我不明白的三元条件运算符之间的奇怪交互。如果我们这样做...:

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

...然后我们得到输出...:

foo, yes bar

...正如我们所料。但是,如果我们这样做...:

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

...然后我们就得到输出...:

yes

为什么在第二种情况下没有将“bar”附加到输出?

zdi*_*dim 10

让我们做吧,但要真实——也就是说,有警告

perl -we'print (1 ? "yes" : "no") . " bar"'
Run Code Online (Sandbox Code Playgroud)

它打印

print (...) 解释为 -e 第 1 行的函数。
在 -e 第 1 行的 void 上下文中无用地使用连接 (.) 或字符串。
是的

(但最后没有换行符)

因此,由于(1 ? "yes" : "no")被视为函数的参数列表,因此print将三元计算为yes,这就是 for 的参数print,因此单独打印。由于这是一个众所周知的“陷阱”,很容易出错,因此我们收到了警告。

然后将字符串" bar"连接起来(到它的返回值print1),在 void 上下文中什么是无意义的,并且我们也会收到警告。

一种解决方法是添加 a +,强制解释()为表达式

perl -we'print +(1 ? "yes" : "no") . " bar", "\n"'
Run Code Online (Sandbox Code Playgroud)

或者,print使用完整的括号正确调用as 函数

perl -we'print( (1 ? "yes" : "no") . " bar", "\n" )'
Run Code Online (Sandbox Code Playgroud)

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

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