Perl中的字符串连接涉及函数的输出等

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)