为什么这个数组只打印最后一个数字?

时间:2016-09-02 14:09:59

标签: perl

我第一次使用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');

2 个答案:

答案 0 :(得分:3)

如果你采取循环:

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});
}

答案 1 :(得分:2)

以下是您的代码所做的事情的说明。我将AddCell替换为一个简单的say,就像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),因此值会被覆盖。这就是为什么只有最后一轮价值观的原因。

我真的不知道你期望什么是正确的输出,但既然你有固定的行,你可能想要使用三列?在为每个$col编写所有行后,您可以增加$rev变量。

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。你不需要引用这样的变量。