以下代码不输出任何内容:
print (1 == 2)."a";
就像这样:
print qw< One Two Three > . "a";
但是这会输出一个雪人,然后是字母a,如预期的那样:
print chr(0x2603)."a";
是否存在连接一般“事物”的一般方法,因为缺少一个更好的单词(例如函数输出和布尔比较的结果)和字符串片段总是有效?因为.
运算符似乎不可靠。
答案 0 :(得分:12)
由于列表和上下文在Perl中的工作方式,这是预期的行为。
发生了什么
该行
print (1 == 2)."a";
解析如下:
( print( 1 == 2 ) . "a" )
由于1==2
返回一个空字符串,因此不打印任何内容。然后,print
本身的返回值与a
连接并丢弃。
如果你打开use warnings
(你应该一直这样做,还有use strict
)你会看到:
print(...)在-e line 1处被解释为函数 在-e第1行的void上下文中无用地使用连接(。)或字符串。
该行
print qw< One Two Three > . "a";
实际上是否会打印字符串Threea
。这是因为qw< One Two Three >
等同于表达式( 'One', 'Two', 'Three' )
。连接运算符.
将该表达式放在标量上下文中,标量上下文中逗号运算符的行为是返回其右侧操作数。因此表达式减少到Threea
。同样,如果你有warnings
,你会看到:
在-e line 1的void上下文中无用的常量(“One”) 在-e第1行的void上下文中无用的常量(“Two”)。
故事的寓意
use strict;
use warnings;