1

以下のプログラムは、配列を取り、それを圧縮して、積が繰り返されないようにし、合計を合計する必要があります。

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

しかし、ハッシュを印刷する前に、「Use of uninitialized value in addition (+)」というエラーが 6 回表示されます。Perl を初めて使用するので (これは教科書以外で初めての Perl プログラムです)、誰か教えてください。すべてを初期化したようです...

4

3 に答える 3

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];

警告なしで動作します。

于 2012-04-29T18:19:29.107 に答える
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};
}
于 2012-04-29T23:08:06.380 に答える
0

ハッシュとして cleanarray を使用していますが、配列として宣言されています

于 2012-04-29T18:18:04.287 に答える