如何在Perl中引用拆分表达式?

dr *_*rry 16 arrays perl split reference

我想创建一个通过Perl中的拆分获得的数组的引用.我想的是:

my $test = \split( /,/, 'a,b,c,d,e');

foreach $k (@$test) {
   print "k is $k\n";
}
Run Code Online (Sandbox Code Playgroud)

但是,Not an ARRAY reference at c:\temp\test.pl line 3. 我抱怨,我尝试了一些其他选择,都没有成功.

Sin*_*nür 34

背景说明:

与其他函数一样,split返回一个列表.您无法参考列表.但是,如果将引用运算符应用于列表,则会将其应用于其所有成员.例如:

use Data::Dumper;

my @x = \('a' .. 'c');

print Dumper \@x
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = [
          \'a',
          \'b',
          \'c'
        ];

因此,在编写时my $test = \split( /,/, 'a,b,c,d,e');,您将获得对返回列表的最后一个元素的引用(例如,请参阅列表和数组之间的区别是什么?).你的情况类似于:

虽然看起来你的右侧有一个列表,但Perl实际上看到了一串用逗号分隔的标量:

my $scalar = ( 'dog', 'cat', 'bird' );  # $scalar gets bird
Run Code Online (Sandbox Code Playgroud)

由于您正在分配标量,因此右侧是标量上下文.标量上下文中的逗号运算符(是的,它是运算符!)评估其左侧,抛出结果,并评估它的右侧并返回结果.实际上,该列表看起来像是标量,它是最正确的值.许多人搞砸了这一点,因为他们选择了一个类似于列表的列表,其最后一个元素也是他们期望的计数:

my $scalar = ( 1, 2, 3 );  # $scalar gets 3, accidentally
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您在RHS上获得的是对返回的列表元素的引用列表split,并且该列表的最后一个元素最终会出现$test.首先需要从这些返回值构造一个数组并引用它.您可以通过形成一个匿名数组并将引用存储在以下内容中来创建单个语句$test:

my $test = [ split( /,/, 'a,b,c,d,e') ];
Run Code Online (Sandbox Code Playgroud)


Bir*_*rei 20

split方括号之间的环绕命令可以进行匿名引用.

my $test = [ split( /,/, 'a,b,c,d,e') ];
Run Code Online (Sandbox Code Playgroud)