1

我试图理解Perl.
我尝试了以下方法:

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

2 回答 2

4

print @sorted prints "array" because you forgot the @ in the previous line :P Change sort(array) to sort(@array) and it will print "billgeorgejohn".

As for why does print @array concatenate the quoted words, first let's make sure we're on the same page regarding qw:

@array = qw(john bill george);

is equivalent to

@array = ("john", "bill", "george");

so you're getting an array of three elements. Next, see the documentation for print. Passing a list of stuff to print will print them all, in order, separated by whatever value $, (the output field separator) has at the time. The default is empty string.

So you could do:

$, = " ";
print @array;

to get "john bill george".

于 2013-04-10T20:07:16.473 回答
2

该函数print接受参数列表并打印这些参数。

如果你明确地将一个列表传递给printthen 我希望当它打印出该列表的元素而它们之间没有空格时你不会感到惊讶。

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手册页中定义的。

数组插值

通过将元素与 $" 变量中指定的分隔符连接起来,数组和切片被插入双引号字符串(如果指定了“use English;”,则为 $LIST_SEPARATOR),默认为空格。

因此,默认情况下,Perl 通过在元素之间插入空格来将数组插入双引号字符串。您可以通过更改$".

这两个示例可能看起来相同,但实际上它们非常不同。

于 2013-04-11T08:47:52.030 回答