为什么打印会在有换行和不换行时给出不同的输出?

Sun*_*ula 2 arrays perl

我在print正则表达式匹配语句中有两个不同的结果,有和没有换行符.为什么?

$string16="abfoo bcfooo defooo ghfooo ijfoo klfooo mnfooo";
@foo=$string16=~ m/foo/g;
print(@foo);
print("\n");

$string17="abfoo bcfooo defooo ghfooo ijfoo klfooo mnfooo";
@foo=$string17=~ m/foo/g;
print(@foo."\n");
Run Code Online (Sandbox Code Playgroud)

结果:

foofoofoofoofoofoofoo
7
Run Code Online (Sandbox Code Playgroud)

sim*_*que 13

因为您正在使用连接运算符.,它强制@foo进入标量上下文.数组在标量上下文中返回其元素数.

使用参数列表而不是与您的串联print来获取列表和换行符.@foo无论如何,数组将扩展到它包含的列表,因此换行符只是另一个参数print.

print @foo, "\n";
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您可以使用say,需要激活use feature 'say'.它不需要在打印时附加换行符.say可从Perl 5.10获得.

use feature 'say';
say @foo;
Run Code Online (Sandbox Code Playgroud)

你也可以打开它

use v5.10;
Run Code Online (Sandbox Code Playgroud)

这与正则表达式无关.这是Perl的核心行为,以及Perl中的列表如何工作.

以下是对Perl中上下文含义的一个很好的解释.

  • 正确的行结尾是每个平台上的换行符.PerlIO在输入和输出之间转换它和nat8ve行结尾. (3认同)