Я бы не хотел сталкиваться с таким регулярным выражением в коде. Любое небольшое изменение, и оно сломано.
Я бы открыл файловый дескриптор на ссылку на строку, а затем прочитал ее строки. Пропускайте все, пока не попадете в начальную строку, а затем прочитайте все до конечной строки:
use v5.26;
my $string =<<~'HERE';
begin
keyworda
keywordb
end
keywordc
end
HERE
open my $fh, '<', \$string;
while( <$fh> ) { last if /\Abegin/ }
my @keywords;
while( <$fh> ) {
last if /^end/;
chomp;
push @keywords, $_;
}
say join "\n", @keywords;
Это приводит к выводу:
keyworda
keywordb
Или разбейте его на два регулярных выражения. Один устанавливает начальную позицию, затем вы несколько раз совпадаете, пока линия не является конечной. Это немного чище, но некоторые люди могут быть смущены глобальным соответствием в скалярном контексте:
use v5.26;
my $string =<<~'HERE';
begin
keyworda
keywordb
end
keywordc
end
HERE
my @keywords;
if( $string =~ / ^ begin \R /gmx ) {
while( $string =~ /\G (?!end \R) (\N+) \R /gx ) {
push @keywords, $1;
}
}
say join "\n", @keywords;