Простое регулярное выражение и pos решение:
my $str = "ABCDE";
my $pat = "--(-)-";
my @list;
while ($pat =~ /(?=[()])/g) {
last if pos($pat) > length($str); # Required to prevent matching outside $x
my $char = substr($str, pos($y), 1);
push @list, $char;
}
print @list;
Обратите внимание на использование Lookahead для получения позиции перед соответствующим символом.
В сочетании с использованием Аксеманом переменной @-
мы можем получить альтернативный цикл:
while ($pat =~ /[()]/g) {
last if $-[0] > length($str);
my $char = substr($str, $-[0], 1);
push @list, $char;
}
Это в значительной степени упоминается в документации по@-
:
After a match against some variable $var :
....
$& is the same as substr($var, $-[0], $+[0] - $-[0])
Другими словами, соответствующая строка $&
равна этому выражению подстроки.Если вы замените $var
другой строкой, вы получите символы, совпадающие с теми же позициями.
В моем примере выражение $+[0] - $-[0]
(смещение конца совпадения минус смещение начала совпадения) будет1, поскольку это максимальная длина соответствующего регулярного выражения.
КЭД.