2016-05-27 6 views
1

whileループに一致する値がいくつか見つからないのはなぜですか? この結果出力は、ファイルを読み取った後にすべての可能な値を戻していません。いくつか欠けている値があります。Perlループで正しい結果がフィルタリングされない

# str_1,2,3,4 are my search strings 

while ($line = <$fh>) { 

    if ($line !~ /$str_1/ && $line =~ /$str_2/) { 
     open($fh, '>>report.txt'); 
     print $fh "$file : $line"; 
     close $fh; 
    } 

    if ($line !~ /$str_3/ && $line =~ /$str_4/) { 
     open($fh, '>>report.txt'); 
     print $fh "$file : $line"; 
     close $fh; 
    } 
} 

出力:例えば

Number of Attendance = 1 INFO:21 
Number of Attendance = 2 INFO:21 
Number of Attendance = 1 INFO:21 

# There are results such as Number of Attendance = 8 INFO:21 which my code is not able to search. 

 #my log file which is the input 
    Number of Attendance = 1 from XYZ FACI  INFO:21 
    Number of Attendance = 0 from UZQ BLAH  INFO:21 
    Number of Attendance = 8 from WZW BLAH  INFO:21 
    Number of Attendance = 0 from WZW BLAH  INFO:21 
    Number of Attendance = 0 from WZW BLAH  INFO:21 
    Number of Attendance = 0 from WZW BLAH  INFO:21 

    so here my str1 = /Number of Attendance = 0/ 
       str2 = /INFO:21/ 

    #So output for my code now is only 

    Number of Attendance = 1 from XYZ FACI  INFO:21 

    #But,Expected output should be 

    Number of Attendance = 1 from XYZ FACI  INFO:21 
    Number of Attendance = 8 from WZW BLAH  INFO:21 

は、私はそのだけ一度だけ私のすべてのファイルを読み込み、すべての可能な値を返すのではなく、第1の出力値を返すと思います。

+4

あなたは明示的に入力、expeを言いたいことができますか? cted出力とこのコードが出力している出力? – SilentMonk

+1

'$ str1'のパターンが一致したり、' $ str_2'のパターンが一致しないため、 '$ str3'のパターンが一致するか、' $ str_4'のパターンが一致しないためです。 – ikegami

答えて

1

あなたが繰り返し処理しようとしているファイルハンドルをクローズしています!あなたのコードでuse warnings;を持っていた場合

、perlはあなたに警告しているだろう:常にuse warnings;use strict;

readline() on closed filehandle $fh at /home/felix/abdc/foo.pl line 9.

このようなあなたのwhileループを書き直し

open my $fh, "<$file" or die "Unable to open '$file' : $!"; 
open my $out, ">output_log" or die "Unable to open 'output_log' : $!"; 

while (my $line = <$fh>) { 
    if (...) { 
     print $out $line; 
    } 
    ... 
} 
close $out or die "Unable to finish writing output_log : $!"; 
+0

アイデアありがとう!しかし、私は条件が適切に働くことを知りました。しかし、それは最初の結果を取り出すだけで、ファイル上のさらなる行をチェックすることはできません。上の例を@xxfelixxx –

+0

のwhileループ内で '$ fh'から' $ fh_log'に変更してみてください。反復しようとしているファイルハンドルを閉じている可能性があります。これは、1回のマッチの後にあなたを切断します。 – xxfelixxx

+0

はい!あなたが正しいです!!すぐにうまくいく –

関連する問題