为什么这个数组只打印最后一个数字?
我第一次使用Perl。我使用它从一个Excel文件中的多个单元格获取数据,并将它们放入另一个现有的Excel文件中。为什么这个数组只打印最后一个数字?
我设法从第一个文件中提取需要的数据并将其放入@array。我开始了一个新文件,试图将数据写入我需要的特定单元格中。
问题是,当脚本运行时,它在所有单元格中都有相同的数字,18365.虽然@rows数组工作正常,并将数字放入正确的单元格中,但@revenue数组只打印最后一个数字。
有什么我可以忽略或不理解?有一个更好的方法吗?我提前谢谢你。
use warnings;
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::SaveParser;
my $parser = Spreadsheet::ParseExcel::SaveParser->new();
my $workbook = $parser->Parse('xls_test.xls');
if (!defined $workbook) {
die $parser->error(), ".\n";
}
my $worksheet = $workbook->worksheet(0);
my @rows = (2, 10, 17);
my @revenue = (10200, 9025, 18365);
my $col = 2;
foreach my $rev (@revenue) {
foreach my $r (@rows) {
$worksheet->AddCell($r, $col, "$rev");
}
}
$workbook->SaveAs('xls_test.xls');
如果你把你的循环:
foreach my $rev (@revenue) {
foreach my $r (@rows) {
$worksheet->AddCell($r, $col, "$rev");
}
}
最后$rev
写的是18365,你将在所有3行覆盖以前的值。
你可以做的是创造来自您列出了行到收入哈希并遍历它:
my @rows = (2, 10, 17);
my @revenue = (10200, 9025, 18365);
my $col = 2;
my %data;
for my $i (0 .. $#rows) {
$data{$rows[$i]} = $revenue[$i]; # row => revenue
}
foreach $row (keys %data) {
$worksheet->AddCell($row, $col, $data{$row});
}
这与我所希望的完全相同。我会再研究一下哈希。谢谢。 – MBH
这里是你的代码做什么的说明。我用一个简单的say
替换了AddCell
,这就像print
,最后换行符。
use strict;
use warnings 'all';
use feature 'say';
my @rows = (2, 10, 17);
my @revenue = (10200, 9025, 18365);
my $col = 2;
say "row\tcol\trev";
foreach my $rev (@revenue) {
foreach my $r (@rows) {
say join "\t", $r, $col, $rev;
}
}
这是输出:
row col rev
2 2 10200
10 2 10200
17 2 10200
2 2 9025
10 2 9025
17 2 9025
2 2 18365
10 2 18365
17 2 18365
正如你所看到的,它通过所有的收入迭代,然后对每个收入其写入行2,10和17
2 2 10200
10 2 10200
17 2 10200
这里又一次。
2 2 9025
10 2 9025
17 2 9025
由于它总是在同一列(即2),所以这些值会被覆盖。这就是为什么只有最后一轮的价值在那里。
我真的不知道你期待什么作为正确的输出,但既然你有固定的行,你可能想要使用三列?在完成每个$rev
的所有行写入后,您可以增加$col
变量。
foreach my $rev (@revenue) {
foreach my $r (@rows) {
$worksheet->AddCell($r, $col, $rev);
}
$col++;
}
现在我们上面的小程序的输出会是这样的,所有的值都会在那里。
row col rev
2 2 10200
10 2 10200
17 2 10200
2 3 9025
10 3 9025
17 3 9025
2 4 18365
10 4 18365
17 4 18365
注意,我去掉了双引号""
周围$rev
。你不需要引用那样的变量。
谢谢你的明确解释。我想我明白我以前出错的地方。所需的输出将 排山坳修订版 2 2 10200 - 10 2 9025 - 17 2 18365 - 所以我需要他们的循环,但只有一次每个。不幸的是,我正在使用现有的电子表格,因此使用其他列不起作用。 – MBH
数组不打印任何东西。这是你的代码,而不是数组。 – simbabque