私が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];
}
}
にライン
を変更するには、交換する必要があり、' $ '$ missing_files {$ jを}'とmissing_files [$ jを} ' 。 –
$ missing_files [$ j} = $ {k}があるので、これはコンパイルされません。 - 正しいように修正できますか? –
ああ、タイプミスです。しかし、私はボロディンが以下の質問に答えてくれたと思います。皆さん。 –