Tyl*_*ler 6 perl string-concatenation
以下代码不输出任何内容:
print (1 == 2)."a";
Run Code Online (Sandbox Code Playgroud)
就像这样:
print qw< One Two Three > . "a";
Run Code Online (Sandbox Code Playgroud)
但是这会输出一个雪人,然后是字母a,如预期的那样:
print chr(0x2603)."a";
Run Code Online (Sandbox Code Playgroud)
是否存在连接一般"事物"的一般方法,因为缺少一个更好的单词(例如函数输出和布尔比较的结果)与字符串片段总是有效?因为.操作员似乎不可靠.
fri*_*edo 11
由于列表和上下文在Perl中的工作方式,这是预期的行为.
发生了什么
这条线
print (1 == 2)."a";
Run Code Online (Sandbox Code Playgroud)
解析如下:
( print( 1 == 2 ) . "a" )
Run Code Online (Sandbox Code Playgroud)
由于1==2返回空字符串,因此不会打印任何内容.然后将print自身的返回值连接a并丢弃.
如果你已经打开了use warnings(你应该一直这样做,use strict你会看到):
print(...)在-e行解释为函数1.
在-e第1行的void上下文中无用地使用连接(.)或字符串.
这条线
print qw< One Two Three > . "a";
Run Code Online (Sandbox Code Playgroud)
事实上,是否打印字符串Threea.那是因为qw< One Two Three >相当于表达式( 'One', 'Two', 'Three' ).连接运算符.将该表达式放在标量上下文中,标量上下文中逗号运算符的行为是返回其右侧操作数.因此表达式减少到Threea.再说一遍,如果你有warnings,你会看到:
在-e line 1的void上下文中无用地使用常量("One")
1.在-e行1的void上下文中无用的常量("Two").
这个故事的主旨
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)