2013-04-10 60 views
1

我想了解Perl中的上下文(数组/列表/标量)。
我试过如下:试图理解Perl中的数组/列表中的上下文

@array = qw (john bill george); 
print @array; 
print "\n"; 
@sorted = sort (array); 
print @sorted; 
  1. 为什么会出现print @array concats中引用的话?我需要print "@array";才能打印清单?我的意思是@表示一个数组的权利? 那么为什么要打印报价呢?
  2. 为什么print @sorted;打印array?如果它被当作 标量不应该打印3这是数组的大小?
+3

务必使用'use strict;使用警告;'在你的程序中。如果有的话,这会告诉你'未加引号的字符串“数组”可能会与将来的保留字冲突......,这是使用诸如'array'之类的裸词时得到的警告。 – TLP 2013-04-10 20:11:34

回答

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; 

让 “约翰·乔治法案”。

+0

我知道我没有使用'@'.我的问题是为什么没有打印3.我认为在标量环境中我们得到了数组的大小。它的名字 – Cratylus 2013-04-10 20:10:06

+2

'print'可以采用标量或列表中,列表是默认的,所以为了强制标量上下文,你必须执行'print scalar @ array'。省略“@”只是使其成为一个空话。在标量上下文是唯一可能的地方,你仍然会使用'@ array',例如'if(@array == 3){print“size is 3”; }'是检查大小是否为3的有效代码。 – miorel 2013-04-10 20:11:05

+1

@Cratylus它没有打印它的名字。它打印出你给它的单词。 'array'与数组''array'没有任何关系。他们是两个完全不同的东西。另外,'print'强加一个列表上下文,而不是标量。 – TLP 2013-04-10 20:14:57

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的元素之间插入空格阵列插值到双引号字符串,可以通过更改的值改变这种行为。

这两个例子可能看起来一样,但实际上它们很不相同。