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

问题描述:

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

数组不打印任何东西。这是你的代码,而不是数组。 – simbabque

如果你把你的循环:

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

这与我所希望的完全相同。我会再研究一下哈希。谢谢。 – 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。你不需要引用那样的变量。

+0

谢谢你的明确解释。我想我明白我以前出错的地方。所需的输出将 排山坳修订版 2 2 10200 - 10 2 9025 - 17 2 18365 - 所以我需要他们的循环,但只有一次每个。不幸的是,我正在使用现有的电子表格,因此使用其他列不起作用。 – MBH