2013-11-01 62 views
1

我想使用構建一個哈希表來讀取文件列表,並將每個值存儲到哈希中,如下所示: - 打開目錄並將它們列在數組中 - 然後打開每個文件,並從每個文件中的一些值,並把它們放到了桌子 文件名,總,通了,當我通過for循環,我得到運行它未能在哈希表如何使用Perl構建哈希表

#!/usr/bin/perl 
use strict; 

my $dir = "../result"; 
opendir(DIR, $dir) or die $!; 
my %result =(); 

while (my $file = readdir(DIR)) { 
    # We only want files 
    next unless (-f "$dir/$file"); 

    # do something here and get some value from each file 
    $total = $worksheet->get_cell(0,1); 
    $pass = $worksheet->get_cell(1,1); 
    $fail = $worksheet->get_cell(2,1); 

    # Print the cell value when not blank 
    $total = $total->value(); 
    $pass = $pass->value(); 
    $fail = $fail->value(); 


    %result = (
       "name" => "$file", 
       "total" => "$total", 
       "pass" => "$pass", 
       "fail" => "$fail" 
    ); 

} 

foreach my $key (keys %result) { 
    print "Key: $key, Value: $result{$key}\n"; 
} 

只有最後一個入口或最後一個文件的目錄,我如何添加和建立散列,跟蹤所有文件的密鑰&上面提到的價值.. 在此先感謝..

+0

您可能想看看['File :: Find'](http://perldoc.perl.org/File/Find.html)模塊 – jkshah

+0

您是否在程序的頂部放置了'use strict'避免告知?有它在那裏很好,但你也需要聲明你的變量。就目前而言,你的程序不會編譯。 – Borodin

回答

1

您只會得到最後一個值,因爲您每次都通過循環覆蓋%result的值。

這聽起來像你想要一個散列數組而不是單個散列。怎麼樣是這樣的:

my @results; 
while (my $file = readdir(DIR)) { 
    ... 
    my %file_result = (
     "name" => "$file", 
     "total" => "$total", 
     "pass" => "$pass", 
     "fail" => "$fail" 
    ); 

    push @results, \%file_result; 
} 
+0

感謝它的作用就像一個魅力..你們是偉大 – user2912312

+0

@ user2912312,請確保您檢查答案旁邊的綠色複選標記,以表明它被接受。 – friedo

1

商店要在哈希什麼:

相反的:

%result = (
       "name" => "$file", 
       "total" => "$total", 
       "pass" => "$pass", 
       "fail" => "$fail" 
    ); 

它取代每次整個哈希, 嘗試類似:

$result{$file} = "$total $pass $fail"; 

在這種情況下,散列的鍵將是文件名, 和值連接的其他值的字符串。

您還可以使散列元素更復雜一些, 就像一個數組持有這三個值,或任何您可能需要的。

+0

@T G感謝它的魅力。你們很棒 – user2912312