Вы можете использовать оператор диапазона , который действует как триггер в скалярном контексте:
foreach ( @parseme ) {
if ( /Begin bangle tracking log/ .. /End bangle tracking log/ ) {
push @array, $_;
}
# other stuff...
}
Я использовал $_
для цикла foreach
, потому что он обеспечивает более краткий синтаксис. Вы можете использовать другую переменную, если хотите, но тогда вам нужно записать условие в виде:
if ( $line =~ /Begin .../ .. $line =~ /End .../ ) {
, который может быть более читабельным с некоторыми дополнительными скобками:
if ( ($line =~ /Begin .../) .. ($line =~ /End .../) ) {
Одна проблема, которую следует отметить в связи с оператором триггера, заключается в том, что он запоминает свое состояние даже после окончания цикла. Это означает, что, если вы намереваетесь запустить цикл снова, вы действительно должны убедиться, что массив @parseme
заканчивается строкой, соответствующей регулярному выражению /End .../
, так что триггер будет быть в известном состоянии, когда цикл запускается в следующий раз.
Редактировать: Согласно приведенному ниже комментарию DVK, если вы хотите обработать собранные строки, как только достигнете строки нижнего колонтитула, вы можете сделать это, проверив возвращаемое значение оператора ..
, который заканчивается на E0
в последней строке:
foreach ( @parseme ) {
my $in_block = /Begin bangle tracking log/ .. /End bangle tracking log/;
if ( $in_block ) {
push @array, $_;
}
if ( $in_block =~ /E0$/ ) { # last line
# process the lines in @array
@array = ();
}
# other stuff...
}