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;
}
Dies könnte in der Tat eine gute Verwendung für einen 'CONTINUE Block sein. –