我试图理解Perl
中的上下文(数组/列表/标量)
我尝试了以下方法:
@array = qw (john bill george);
print @array;
print "\n";
@sorted = sort (array);
print @sorted;
print @array
会对引用的单词进行汇总?我需要print
"@array";
来打印列表吗?我的意思是@
表示阵列对吗?
那么为什么印刷需要引用?print @sorted;
打印array
?如果它被视为一个
标量不应该打印3
这是数组的大小吗?答案 0 :(得分:4)
print @sorted
打印“数组”,因为您忘记了上一行中的@
:P
将sort(array)
更改为sort(@array)
,它将打印“billgeorgejohn”。
至于为什么print @array
连接引用的单词,首先让我们确保我们在qw
的同一页上:
@array = qw(john bill george);
相当于
@array = ("john", "bill", "george");
所以你得到一个包含三个元素的数组。接下来,请参阅the documentation for print
。将一个东西列表传递给print
将按顺序将它们全部打印出来,以$,
(输出字段分隔符)当时具有的值分隔。默认为空字符串。
所以你可以这样做:
$, = " ";
print @array;
获得“john bill george”。
答案 1 :(得分:2)
函数print
获取参数列表并打印这些参数。
如果您明确地将列表传递给print
,那么我希望您在打印出该列表的元素时不会感到惊讶。
print 'one', 'two', 'three'; # prints "onetwothree
将数组传递给print
完全相同。数组的内容将转换为列表,然后传递给print
;
my @array = qw(one two three);
print @array; # prints "onetwothree"
在这两种情况下,print
都会收到三个参数并打印出那些没有分隔的参数。
实际上,Perl使用特殊变量$,
来控制其参数之间的print
输出。默认情况下,这是一个空字符串,但您可以更改它。
现在让我们考虑你的另一个案例。
my @array = qw(one two three);
print "@array"; # prints "one two three"
此示例中print
有多少个参数?嗯,这只是一个,不是吗?这是一个双引号字符串。当Perl看到双引号字符串时,它会扩展字符串中的所有变量。然后将该扩展的结果传递给print
,然后将其打印出来。因此,我们需要了解Perl如何在双引号中扩展数组。这是在perldata手册页中定义的。
数组插值
将数组和切片插入到双引号字符串中 使用$“变量中指定的分隔符连接元素 (如果指定“使用英语;”,则为$ LIST_SEPARATOR),默认为空格。
因此,默认情况下,Perl通过在元素之间插入空格将数组插入到双引号字符串中。您可以通过更改$"
的值来更改该行为。
这两个例子可能看起来一样,但它们实际上是非常不同的。