试图理解Perl中数组/列表中的上下文

时间:2013-04-10 20:02:11

标签: arrays perl list

我试图理解Perl中的上下文(数组/列表/标量) 我尝试了以下方法:

@array = qw (john bill george);  
print @array;  
print "\n";  
@sorted = sort (array);  
print @sorted;  
  1. 为什么print @array会对引用的单词进行汇总?我需要print "@array";来打印列表吗?我的意思是@表示阵列对吗? 那么为什么印刷需要引用?
  2. 为什么print @sorted;打印array?如果它被视为一个 标量不应该打印3这是数组的大小吗?

2 个答案:

答案 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通过在元素之间插入空格将数组插入到双引号字符串中。您可以通过更改$"的值来更改该行为。

这两个例子可能看起来一样,但它们实际上是非常不同的。