背景说明:
split,像其他函数一样,返回一个列表。你不能对一个列表取引用。但是,如果你将引用运算符应用到一个列表上,它会被应用到它所有的成员。例如:
use Data::Dumper;
my @x = \('a' .. 'c');
print Dumper \@x
输出结果:
$VAR1 = [
\'a',
\'b',
\'c'
];
因此,当你写my $test = \split( /,/, 'a,b,c,d,e');
时,你会得到一个指向返回列表的最后一个元素的引用(参见例如“列表”和“数组”的区别是什么?)。您的情况类似于:
尽管右侧看起来像是一个列表,但实际上Perl看到的是一堆由逗号分隔的标量:
my $scalar = ( 'dog', 'cat', 'bird' ); # $scalar gets bird
由于您正在分配给一个标量变量,因此右侧处于标量语境。在标量语境中,逗号运算符(是的,它是一种运算符!)评估其左操作数,丢弃结果,并评估其右操作数并返回结果。实际上,这个类似于列表的东西将其最右边的值分配给了$scalar。许多人会犯这个错误,因为他们选择了一个类似于列表的东西,其最后一个元素也是他们期望的计数:
my $scalar = ( 1, 2, 3 ); # $scalar gets 3, accidentally
在您的情况下,RHS(右手边)返回的是对
split
返回列表中元素的引用列表,该列表的最后一个元素最终存储在
$test
中。您需要先从这些返回值构建一个数组并取得它的引用。您可以通过形成匿名数组并将其引用存储在
$test
中来将其变为单个语句。
my $test = [ split( /,/, 'a,b,c,d,e') ];