遇到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