看看perldoc -q "list and an array"。最大的不同是数组是一个变量,但是Perl的所有数据类型(标量、数组和散列)都可以提供一个list,它只是一个有序的集合标量。
考虑这段代码
use strict;
use warnings;
my $scalar = 'text';
my @array = (1, 2, 3);
my %hash = (key1 => 'val1', key2 => 'val2');
test();
test($scalar);
test(@array);
test(%hash);
sub test { printf "( %s )\n", join ', ', @_ }
输出这个
( )
( text )
( 1, 2, 3 )
( key2, val2, key1, val1 )
Perl 子例程采用 list 作为其参数。在第一种情况下,列表是空的;在第二个中,它有一个元素( $scalar);在第三个列表中,列表大小与@array 相同,包含( $array[0], $array[1], $array[2], ...),在最后一个列表中,它是%hash 中元素数量的两倍,并且包含( 'key1', $hash{key1}, 'key2', $hash{key2}, ...) .
很明显,该列表可以通过多种方式提供,包括标量变量、标量常量和子例程调用结果的混合,例如
test($scalar, $array[1], $hash{key2}, 99, {aa => 1, bb => 2}, \*STDOUT, test2())
我希望很清楚这样的列表与数组有很大不同。
将数组视为列表变量会有所帮助吗?区分标量文字和标量变量很少有问题。例如:
my $str = 'string';
my $num = 99;
很明显'string' 和99 是文字,而$str 和$num 是变量。而且这里的区别是一样的:
my @numbers = (1, 2, 3, 4);
my @strings = qw/ aa bb cc dd /;
其中(1, 2, 3, 4) 和qw/ aa bb cc dd / 是列表文字,而@numbers 和@strings 是变量。