2012-04-29 53 views
1

下面的程序應該採用一個數組並對其進行壓縮,以便沒有重複的產品並將總計加起來,所以:這個Perl腳本爲什麼給我一個「使用未初始化的值(+)」錯誤

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

Howeve在打印散列之前,它給了我六次「使用未初始化的值(+)」錯誤「。作爲Perl的新手(這是我在教科書以外的第一個Perl程序),有人能告訴我爲什麼會發生這種情況嗎?好像我已經初始化一切...

+2

你從來沒有初始化過@ cleanarray這個錯誤信息告訴你究竟是什麼問題。 –

+2

我敢說你可能想看看[perldsc](http://perldoc.perl.org/perldsc.html),甚至可能是[perlstyle](http://perldoc.perl.org/perlstyle.html )。有一個乾淨的數據結構並適當地訪問它可以避免許多問題。 –

+0

這段代碼應該已經死於錯誤'全局符號'%cleanarray'需要明確的包名稱......'。所以,你很難發佈你實際使用的代碼。 – TLP

回答

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

將無警告地工作。

+0

完美,工作。第一個編譯器錯誤是我再次無法使用Stackoverflow。謝謝。 – RedRaven

0

您使用cleanarray作爲哈希,但它被聲明爲數組

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

感謝鮑羅丁,我確實需要處理我的Perl風格。 – RedRaven

相關問題