2012-01-06 16 views
2

私がPerlでハッシュを使ったのは初めてです。私は奇妙な問題に悩まされています。私がやろうとしているのは、ディレクトリにファイルをバックアップした後、Perlプログラムを使ってすべてのファイルがログファイルに表示されているかどうかを確認することです。だから私は、次のコードを持っていた:私は、テストを行うために、空のログファイルを作っPerlのハッシュを使用する

our (%missing_files) =(); # global definition on the top of the program 

... do something ... 

sub CheckTarResult { 
    my (@dir_list) =(); # dir list 
    my (@file_list) =(); # will be filled with all file names in one dir 
    my ($j) = ""; 
    my ($k) = "";   # loop variable 
    my ($errors) = 0;  # number of missing files 

    ... do something ... 

    foreach $j (@dir_list) { 

    @file_list = `ls $j`; 

    foreach $k (@file_list) { 
     $result = `cat $logfile | grep $k`; 
     if ($result eq "") { 
     $errors++; 
     $missing_files{$j} = ${k}; 
     } 
    } 
    @file_list =(); 
    } 

    ... do something ... 

    my($dir) = ""; 
    my($file) = ""; 
    while (($dir, $file) = each(%missing_files)) { 
    print $dir . " : " . $file; 
    } 

を、期待した結果は、すべてのファイルが欠落している私を与える必要がありますが、何らかの形で「missing_files」のみ各ディレクトリ内の最後の欠けているファイルを保存します。論理は単純なようですが、私はここで何が欠けていますか?

編集: @Bododinのアドバイスを使用しました。しかし、配列参照の内容を出力するには、配列内の要素をループする必要があります。変更後のコードは、次のようになります。

... everything before is the same ... 
push @{$missing_files{$j}}, ${k}; # put elements in dictionary 

# in the print statement 
while(($dir, $file) = each(%missing_files)) { 
    for $i (0 .. $#$file) { # $#$file represents the array size by reference 
    print $dir . " : " . ${$file}[i]; 
    } 
} 
+0

にライン

$missing_files{$j} = ${k}; 

を変更するには、交換する必要があり、' $ '$ missing_files {$ jを}'とmissing_files [$ jを} ' 。 –

+0

$ missing_files [$ j} = $ {k}があるので、これはコンパイルされません。 - 正しいように修正できますか? –

+0

ああ、タイプミスです。しかし、私はボロディンが以下の質問に答えてくれたと思います。皆さん。 –

答えて

3

Perlハッシュ値には1つのスカラーしか含めることができません。物のリストを保存したい場合は、そのスカラに配列参照を作成する必要があります。 missing_files`はハッシュを指し `ので、それを行うには、

push @{$missing_files{$j}}, ${k}; 
+0

レスポンスのThxですが、参照をどのように印刷しますか?今はARRAY(0xd974bf0)のみを出力します(私のprintステートメントでは、参照はperlに現れますか?)。 –

+2

@dazhuangcao: 'print '@ {$ array_ref}' ' – choroba

+1

' print "$ _ \ n" foreach @ {$ missing_files {$ j}}; ' – Borodin

関連する問題