打印@array和在perl中打印"@array"有什么区别?

Vam*_*ond 2 perl perl-data-structures

考虑以下代码,例如:

@array=(1..10);
print @array;
print "@array";

The output is as follows:
12345678910
1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

Sob*_*que 15

这是关于字符串转换和插值的问题.在perl中,"被区别对待',因为perl被要求插入字符串中的任何变量.

这就是为什么:

my $str = "fish";
print "This is a $str\n";
Run Code Online (Sandbox Code Playgroud)

作品.(用单引号,它不会).但是对于不是字符串的东西,perl应用了一些转换规则.对于大多数情况来说非常基本 - 数值变为等效的字符串(在基数10中).所以:

my $num = 10;
print "The number is $num\n"; 
Run Code Online (Sandbox Code Playgroud)

"只是工作"而不是强迫您使用printf/ sprintf格式化将数值转换为适当的表示.

因此,获得第一个结果的原因是print需要一个参数列表.

所以print @array实际上是print 1,2,3,4,5,6,7,8,9,10;.

这会给你结果,因为你没有为你指定一个分隔符print.(你可以通过设置来做到这一点$,- 见下文)

然而"@array",使用@array在一个显式字符串化上下文,因此首先将其解压缩阵列和空间分离它.

此行为由特殊变量控制$".你可以在这里读到这个perlvar

$" = ":";
print "@array";
Run Code Online (Sandbox Code Playgroud)

另请参见:将数组插入字符串

您还可以"告诉"print使用它来分隔它所获得的值$,.默认情况下,它没有设置(例如是undef - 另见perlvar) - 所以你得到了你的第一个行为.

但你可以:

$, = ",";
print @array;
Run Code Online (Sandbox Code Playgroud)