首页 > 解决方案 > 打印和三元条件运算符之间的奇怪交互

问题描述

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

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

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

foo, yes bar

...正如我们所期望的那样。但是,如果我们这样做...:

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

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

yes

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

标签: functionperlexpression

解决方案


让我们这样做,但要真正做到——也就是说,有警告

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

它打印

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

(但最后没有换行符)

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

然后将字符串" bar"连接起来(到它的返回值printis 1),在 void 上下文中什么是无意义的,对于什么我们也会得到一个警告。

一种解决方法是在前面加上一个+,强制解释()为表达式

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

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

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

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

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


推荐阅读