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