2011-01-12 9 views
2

Könnte mir jemand sagen, wie es in Perl möglich ist, eine Zeile zurück in Perl gehen, wenn Sie über die Textdatei iterieren. Wenn ich zum Beispiel Text in der Zeile sehe und ich ihn erkenne und wenn er als ein bestimmtes Muster erkannt wird, möchte ich zur vorherigen Zeile zurückkehren, etwas tun und weitermachen.Wie geht man eine Zeile zurück mit Perl

Vielen Dank im Voraus.

Antwort

13

Normalerweise gehen Sie nicht zurück, die Sie gerade Spur der vorherigen Linie halten:

my $previous; # contents of previous line 
while (my $line = <$fh>) { 
    if ($line =~ /pattern/) { 
     # do something with $previous 
    } 
    ... 
} continue { 
    $previous = $line; 
} 

Die Verwendung eines continue Block garantiert, dass die Kopie selbst gemacht wird, wenn Sie einen Teil der Bypass Schleifenkörper über next.

Wenn Sie wollen wirklich zurückspulen Sie es mit seek tun können, und tell aber es ist umständlich:

my $previous = undef; # beginning of previous line 
my $current = tell $fh; # beginning of current line 
while (my $line = <$fh>) { 
    if ($line =~ /pattern/ && defined $previous) { 
     my $pos = tell $fh;  # save current position 
     seek $fh, $previous, 0; # seek to beginning of previous line (0 = SEEK_SET) 
     print scalar <$fh>;  # do something with previous line 
     seek $fh, $pos, 0;  # restore position 
    } 
    ... 
} continue { 
    $previous = $current; 
    $current = tell $fh; 
} 
7
my $prevline = ''; 
for my $line (<INFILE>) { 

    # do something with the $line and have $prevline at your disposal 

    $prevline = $line; 
} 
+2

Dies könnte in der Tat eine gute Verwendung für einen 'CONTINUE Block sein. –

Verwandte Themen