如何使用加入?

时间:2015-05-14 14:03:57

标签: arrays perl list perl-data-structures

基于this answer及其join语句的最小代码

my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (@x, @y);

print "Before join @input_list \n";

print join ",", @$_ for @input_list ;

print "After join @input_list \n";

给出了

Before join 20 40 60 80 120 140 16 180 20 
After join 20 40 60 80 120 140 16 180 20 

但在use strict;

  

使用“严格参考”时,不能使用字符串(“10”)作为ARRAY参考号   test4.pl第10行。

joinmanual中加入单独的数组字符串。 这里代码尝试使用数组项的每个哈希(@$_)显然加入逗号。 然而,这似乎正在发生。

为什么这个错误出现在最小代码中?

2 个答案:

答案 0 :(得分:7)

好的,你在这里做了什么:

print join ",", @$_ for @input_list ;

不能工作,因为它是:

  • 迭代@input_list将每个元素提取到$_
  • 取消引用$_假装它是一个数组@$_

这与尝试:

基本相同
print join ( ",", @{"10"} );

这没有任何意义,因此不起作用。

my $string = join ( ",", @input_list );
print $string; 

会做的伎俩。

我认为你在这里失踪的是:

use Data::Dumper; 
my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (@x, @y);
print Dumper \@input_list;

不会生成多维列表。它是一维的。

$VAR1 = [
          '10',
          '20',
          '30',
          '40',
          '60',
          '70',
          '8',
          '90',
          '10'
        ];

我怀疑你可能想要的是:

my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (\@x, \@y);

或者也许:

my $x_ref = [ qw/10 20 30 40/ ];
my $y_ref = [ qw/60 70 8 90 10/ ];
my @input_list = ($x_ref, $y_ref );

这使得@input_list

$VAR1 = [
          [
            '10',
            '20',
            '30',
            '40'
          ],
          [
            '60',
            '70',
            '8',
            '90',
            '10'
          ]
        ];

然后你的' for'循环工作:

print join (",", @$_),"\n" for @input_list ;

因为那时,@input_list实际上是2个项目 - 两个数组引用,然后您可以取消引用和加入。

虽然是一个轻微的警告 - 在做的时候可能会发生其中一个问题:

my @input_list = (\@x, \@y);

因为您正在插入对@x@y的引用 - 如果您重复使用其中任何一项,那么您将更改@input_list的内容 - 这就是为什么使用my @input_list = ( $x_ref, $y_ref );可能更好。

答案 1 :(得分:4)

my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (@x, @y);

这相当于:

my @input_list = qw/10 20 30 40 60 70 8 90 10/;

要创建数组数组,请使用引用:

my @input_list = (\@x, \@y);

然后您的其余代码将按预期工作。