perl concat同一索引上的5个数组

时间:2014-04-13 14:12:08

标签: arrays perl

我有五个数组,我现在尝试将它们写入一个数组中几个小时。奇怪的是,它适用于前三个数组,但只要我添加第四个数组,索引就搞乱了。所有数组的长度都是相同的,所以这样做不应该是一个问题。

Examples:

INPUT:
@names = [jeff,george,ringo,chris]
@td = [10/04/2014,11/04/2014,12/04/2014,13/04/2014]
@vct1= [5,6,4,0]
@vct2= [1,1,2,2]
@vct3= [6,0,1,5]

Expected OUTPUT:
@ffo = [jeff 10/04/2014 5 1 6
        george 11/04/2014 6 1 0
        ringo 12/04/2014 4 2 1
        chris 13/04/2014 0 2 5]

这是我的合并代码:

 for ($i=0;$i<@vct1;++$i) {
     push(@ffo,trim(@names[$i])."\t".trim(@td[$i])."\t".trim(@vct1[$i])."\t".trim(@vct2[$i]).trim(@vct3[$i])."\n");
 }

我用zip和

尝试了List :: MoreUtils
 @ffo = map { $names[$_], $td[$_], $vct1[$_], $vct2[$_], $vct3[$_],  } 0 .. $#names;

但它不起作用。有谁知道为什么?

如果我使用这样的数组,它可以工作:

@names = qw(jeff george ringo chris);
@td = qw(10/04/2014 11/04/2014 12/04/2014 13/04/2014);
@vct1 = qw(5 6 4 0);
@vct2 = qw(1 1 2 2);
@vct3 = qw(6 0 1 5);

for ($i=0;$i<@names;++$i) {
print @names[$i]."\t".@td[$i]."\t".@vct1[$i]."\t".@vct2[$i]."\t".@vct3[$i]."\n";
}

OUTPUT:
jeff    10/04/2014  5   1   6
george  11/04/2014  6   1   0
ringo   12/04/2014  4   2   1
chris   13/04/2014  0   2   5

3 个答案:

答案 0 :(得分:3)

虽然你没有提供足够的信息给我确定,但我会采取疯狂的方式回答这个问题。这段代码:

@names = [jeff,george,ringo,chris]
@td = [10/04/2014,11/04/2014,12/04/2014,13/04/2014]
@vct1= [5,6,4,0]
@vct2= [1,1,2,2]
@vct3= [6,0,1,5]

不编译。它有几个问题:

  • 在行尾没有分号;
  • 未引用这些值,即"jeff","george",字符串10/04/2014将被解释为三个被分割的数字,并将变为0.00124...
  • 您正在为数组分配单个值:匿名数组引用[ ... ]

我的猜测是你真的有这样的东西:

@names = ["jeff","george","ringo","chris"];
@td = ["10/04/2014","11/04/2014","12/04/2014","13/04/2014"];
@vct1= [5,6,4,0];
@vct2= [1,1,2,2];
@vct3= [6,0,1,5];

你没有意识到这将创建一个二维数组,其中每个数组中的第一个元素包含你想要的数组。即:$names[0][0]包含"jeff",依此类推。

你说当你使用qw()时它会起作用,@names = qw(jeff george ringo chris); @names = ("jeff", "george", "ringo", "chris"); 是一个可以创建引用参数列表的函数(助记符:QuoteWords)。这两个是等同的陈述:

use strict;
use warnings;

所以......使用这些方法中的任何一种为数组赋值。

而且,你应该总是使用

{{1}}

他们会告诉你所犯的所有错误。我猜你现在是否将它们添加到你的代码中,你会收到很多警告和致命的错误。这是件好事。不知道你做错了什么并没有帮助你改进代码。

答案 1 :(得分:1)

在原始代码中,您有:

@names = [jeff,george,ringo,chris]
@td = [10/04/2014,11/04/2014,12/04/2014,13/04/2014]
@vct1= [5,6,4,0]
@vct2= [1,1,2,2]
@vct3= [6,0,1,5]

但是你不应该使用[]运算符声明数组,除非你对一组匿名数组感兴趣。

因此,@ ft只包含一个元素,它是对匿名数组的引用:

#! /usr/bin/perl

use strict;
use warnings;

my @td = [10/04/2014,11/04/2014,12/04/2014,13/04/2014];
foreach my $element (@td) {
        print "$element\n"; # Prints a single element ARRAY(0x7f8e108070d0)
}

print "Size of \@td: ", scalar(@td), "\n"; # Prints 1

当您使用知道返回包含所需元素的数组而不是数组引用的qw运算符时,可以避免此问题。

答案 2 :(得分:0)

你应该使用第一种方法,例如:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @names = qw(jeff george ringo chris);
my @td = qw(10/04/2014 11/04/2014 12/04/2014 13/04/2014);
my @vct1= qw(5 6 4 0);
my @vct2= qw(1 1 2 2);
my @vct3= qw(6 0 1 5);

my @ffo;
for (my $i = 0; $i <= $#names; $i++) {
    push @ffo, join("\t", $names[$i], $td[$i], $vct1[$i], $vct2[$i], $vct3[$i]);
}

print Dumper(\@ffo);

运行:

$VAR1 = [
          'jeff 10/04/2014  5   1   6',
          'george   11/04/2014  6   1   0',
          'ringo    12/04/2014  4   2   1',
          'chris    13/04/2014  0   2   5'
        ];