2012-12-19 10 views
8

Ich muss aus einer Datei lesen, durchlaufen Sie es und schreiben Sie die Zeile in eine andere Datei. Wenn die Anzahl der Zeilen einen Schwellenwert erreicht, schließen Sie den Ausgabedateipunkt und öffnen Sie einen neuen.In Perl, wie zu vermeiden, Dateien mehrmals zu öffnen

Wie vermeide ich das Öffnen und Schließen der Ausgabedatei behandeln jedes Mal, wenn ich eine Zeile aus der Eingabedatei behandeln wie unten lesen?

use autodie qw(:all); 

my $tot  = 0; 
my $postfix = 'A'; 
my $threshold = 100; 

open my $fip, '<', 'input.txt'; 
LINE: while (my $line = <$fip>) { 
    my $tot += substr($line, 10, 5);  
    open my $fop, '>>', 'output_' . $postfix; 
    if ($tot < $threshold) { 
     print {$fop} $line; 
    } 
    else { 
     $tot = 0; 
     $postfix++; 
     redo LINE; 
    } 
    close $fop; 
} 
close $fip; 
+3

Öffnen und schließen Sie Ihre Datei nicht innerhalb der for-Schleife. Bewegen Sie den Befehl 'open' über die for-Schleife. –

Antwort

11

Öffnen Sie die Datei nur erneut, wenn Sie $postfix ändern. Auch können Sie ein bisschen einfacher werden.

use warnings; 
use strict; 
use autodie qw(:all); 

my $tot  = 0; 
my $postfix = 'A'; 
my $threshold = 100; 

open my $fop, '>>', 'output_' . $postfix; 
open my $fip, '<', 'input.txt'; 
while (my $line = <$fip>) { 
    $tot += substr($line, 10, 5);  

    if ($tot >= $threshold) { 
     $tot = 0; 
     $postfix++; 
     close $fop; 
     open $fop, '>>', 'output_' . $postfix; 
    } 
    print {$fop} $line; 
} 
close $fip; 
close $fop; 
+2

+1 aber ich denke, du solltest nur den zweiten Teil deiner Antwort behalten. –

+0

Und Sie können unten hinzufügen: 'if (tell ($ fop)! = -1) {close $ fop; } 'um es zu schließen. –

+4

Sie sollten beim Öffnen von Dateien immer eine Fehlerüberprüfung durchführen. Es sei denn natürlich, Sie verwenden das 'Autodie'-Modul. Was du bist. :) – TLP