为什么Perl中的连接打印数组的COUNT而不是数组本身

use*_*867 3 printing arrays perl scalar concat

例如:

my @array = ("a","b","c");

print @array; #prints abc
print "Array is: " . @array #prints 3
Run Code Online (Sandbox Code Playgroud)

是什么让这两个印刷语句有所不同?

Joe*_*e Z 12

连接发生在标量上下文中.引用标量上下文中的数组给出其长度.例如:

my $x = @array;  # sets $x to the length of @array also.
Run Code Online (Sandbox Code Playgroud)

如果要扩展阵列的内容,可以有多个选项.

如果您只是想像在第一个语句中那样打印数组,则可以将连接更改为逗号.这将与原始示例的行为最相似,包括"$",它指定在列表中的每个元素之后出现的分隔符(包括字符串"Array is:"和最后一个元素@array):

print "Array is: ", @array;
Run Code Online (Sandbox Code Playgroud)

你可以把它放在引号中,它会将它作为一个字符串插入,将元素分开$".请注意,$"默认为单个空格字符.如果您需要将它连接到另一个字符串,这可能很有用:

print "Array is: " . "@array";
Run Code Online (Sandbox Code Playgroud)

如果要将数组元素连接到没有分隔符,或者使用除了之外的显式分隔符$",则可以使用join.同样,这在您构建字符串但不一定立即打印的上下文中非常有用.

print "Array is: " . join( "", @array );        # gives "abc"
print "Array is: " . join( " fred ", @array );  # gives "a fred b fred c"
Run Code Online (Sandbox Code Playgroud)

注意:我在上面的标量上下文中添加了一个链接,由Mark-Jason Dominus进行了很好的解释.值得花时间阅读它.它不是很长.