Самый простой способ сделать это в Perl, вероятно, с помощью решения типа итератора. Например, здесь у нас есть подпрограмма, которая формирует замыкание над дескриптором файла:
open my $fh, '<', 'some_file.txt' or die $!;
my $iter = sub {
while( my $line = <$fh> ) {
return $line if $line =~ /foo/;
}
return;
}
Подпрограмма выполняет итерации по строкам, пока не найдет строку, соответствующую шаблону /foo/
, а затем вернет ее, иначе ничего не вернется. (undef
в скалярном контексте.) Поскольку дескриптор файла $fh
определен вне области действия подпрограммы, он остается резидентным в памяти между вызовами. Самое главное, его состояние, включая текущую позицию поиска в файле, сохраняется. Таким образом, каждый вызов подпрограммы возобновляет чтение файла, в котором она остановилась в последний раз.
Чтобы использовать итератор:
while( defined( my $next_line = $iter->() ) ) {
# do something with each line here
}