function - 打印和三元条件运算符之间的奇怪交互
问题描述
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
,这就是 for 的参数print
,因此单独打印。由于这是一个众所周知的“陷阱”,很容易出错,因此我们会收到警告。
然后将字符串" bar"
连接起来(到它的返回值print
is 1
),在 void 上下文中什么是无意义的,对于什么我们也会得到一个警告。
一种解决方法是在前面加上一个+
,强制解释()
为表达式
perl -we'print +(1 ? "yes" : "no") . " bar", "\n"'
或者,print
用完整的括号正确调用 as 函数
perl -we'print( (1 ? "yes" : "no") . " bar", "\n" )'
我在这两种情况下都添加了换行符。
有关相关示例和精确文档链接的详细讨论,请参阅这篇文章。
推荐阅读
- google-cloud-storage - 生成 Cloud Bucket 文件的 CSV
- python - 使用python将numpy数组转换为uint8
- tree - 为什么邻接表可能不适合一棵树?
- python - Django 测试运行器未使用非标准项目结构运行
- c - 是否可以使用 va_arg 将宏作为可选参数传递给可变参数函数
- python - 如何通过 Jupyter Notebook 在 VSCode 中编写 Matlab?
- javascript - 需要图像在两个 div 中的相同位置
- c# - 如何使用标志将鼠标光标更改为默认或其他纹理?
- portable-executable - 如何通过查看 PE 文件头来判断 exe 是静态加载还是动态加载 DLL?
- javascript - 如何在 google.script.run 中恢复 var