下面的程序应该采用一个数组并对其进行压缩,以便没有重复的产品并将总数加起来,所以:
A B B C D A E F
100 30 50 60 100 50 20 90
变为:
A 150
B 80
C 60
D 100
E 20
F 90
下面的代码以我想要的方式运行和运行:
#! C:\strawberry\perl\bin
use strict;
use warnings;
my @firstarray = qw(A B B C D A E F);
my @secondarray = qw (100 30 50 60 100 50 20 90);
my @totalarray;
my %cleanarray;
my $i;
# creates the 2d array which holds variables retrieved from a file
@totalarray = ([@firstarray],[@secondarray]);
my $count = $#{$totalarray[0]};
# prints the array for error checking
for ($i = 0; $i <= $count; $i++) {
print "\n $i) $totalarray[0][$i]\t $totalarray[1][$i]\n";
}
# fills a hash with products (key) and their related totals (value)
for ($i = 0; $i <= $count; $i++) {
$cleanarray{ $totalarray[0][$i] } = $cleanarray{$totalarray[0][$i]} + $totalarray[1][$i];
}
# prints the hash
my $x = 1;
while (my( $k, $v )= each %cleanarray) {
print "$x) Product: $k Cost: $cleanarray{$k} \n";
$x++;
}
然而,在打印哈希之前,它给了我“使用未初始化的值(+)”错误“六次。对于Perl来说是非常新的(这是我在教科书之外的第一个Perl程序),有人可以告诉我为什么会这样?看来我已经初步化了所有事情......
答案 0 :(得分:3)
它在这些行中给出了编译错误:
my @cleanarray;
这是一个哈希。
my %cleanarray;
在这里:
$cleanarray{ $totalarray[0][$i] } = $cleanarray{$totalarray[0][$i]} + totalarray[1][$i];
你错过了totalarray
的印记。它是$totalarray[1][$i]
未定义的消息是因为$cleanarray{$totalarray[0][$i]}
不存在。使用较短的:
$cleanarray{ $totalarray[0][$i] } += totalarray[1][$i];
将在没有警告的情况下工作。
答案 1 :(得分:0)
您正在使用cleanarray作为哈希,但它被声明为数组
答案 2 :(得分:0)
您可能会发现您更喜欢重新组织程序。
use strict;
use warnings;
my @firstarray = qw (A B B C D A E F);
my @secondarray = qw (100 30 50 60 100 50 20 90);
# prints the data for error checking
for my $i (0 .. $#firstarray) {
printf "%d) %s %.2f\n", $i, $firstarray[$i], $secondarray[$i];
}
print "\n";
# fills a hash with products (key) and their related totals (value)
my %cleanarray;
for my $i (0 .. $#firstarray) {
$cleanarray{ $firstarray[$i] } += $secondarray[$i];
}
# prints the hash
my $n = 1;
for my $key (sort keys %cleanarray) {
printf "%d) Product: %s Cost: %.2f\n", $n++, $key, $cleanarray{$key};
}