Обычно вы не возвращаетесь, вы просто следите за предыдущей строкой:
my $previous; # contents of previous line
while (my $line = <$fh>) {
if ($line =~ /pattern/) {
# do something with $previous
}
...
} continue {
$previous = $line;
}
Использование блока continue
гарантирует, что копия будет сделана, даже если вы пропустите частьтело цикла через next
.
Если вы хотите по-настоящему перемотать, вы можете сделать это с seek
и tell
, но это более громоздко:
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;
}