2016-05-27 6 views
1

Warum scheint meine while-Schleife einige Match-Werte zu fehlen? Diese Ergebnisausgabe gibt nach dem Lesen der Dateien nicht alle möglichen Werte zurück. Es gibt einige fehlende Werte.Perl Loop filtert nicht richtig Ergebnisse

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

Ausgang:

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. 

Zum Beispiel:

 #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 

Ich denke, es ist nur nur einmal alle meine Dateien zu lesen und den ersten Ausgangswert zurückkehrt, anstatt alle möglichen Werte zurückzugeben.

+4

Können Sie bitte explizit den Input erwähnen, exper Ausgabe und die Ausgabe, die dieser Code gibt? – SilentMonk

+1

Weil das Muster in '$ str1' übereinstimmt oder das Muster in' $ str_2' nicht, und weil das Muster in '$ str3' übereinstimmt oder das Muster in' $ str_4' nicht stimmt. – ikegami

Antwort

1

Sie schließen das Dateihandle, über das Sie zu iterieren versuchen!

Wenn Sie use warnings; in Ihrem Code haben, perl würden Sie gewarnt:

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

immeruse warnings; und use strict;

Ihre while-Schleife wie folgt neu schreiben:

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

Danke für die Idee! Aber ich habe herausgefunden, dass die Bedingung richtig funktioniert. Aber es holt nur das erste Ergebnis und kann nicht nach weiteren Zeilen in der Datei suchen. Bitte überprüfen Sie das obige Beispiel in der Frage @xxfelixxx –

+0

Versuchen Sie, den Namen der Variablen von '$ fh' in' $ fh_log' innerhalb Ihrer while-Schleife zu ändern. Möglicherweise schließen Sie das Dateihandle, über das Sie zu iterieren versuchen, wodurch Sie nach 1 Übereinstimmung abgeschnitten werden. – xxfelixxx

+0

Ja! Du hast recht!! Jetzt gut arbeiten –

Verwandte Themen