В текущих версиях Perl вы можете использовать магические массивы @-
и @+
для получения позиций совпадений всего регулярного выражения и любых возможных групп захвата. Нулевой элемент обоих массивов содержит индексы, относящиеся ко всей подстроке, поэтому вас интересует $-[0]
.
В виде одного -вкладыша:
$ echo 'aöæaæaæa' | perl -CSDLA -ne 'BEGIN { $pattern = shift }; printf "%d\n", $-[0] while $_ =~ m/$pattern/g;' æa
2
4
6
Или полный скрипт:
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use open ":encoding(utf8)";
undef $/;
my $pattern = decode_utf8(shift);
binmode STDIN, ":utf8";
while (<STDIN>) {
printf "%d\n", $-[0] while $_ =~ m/$pattern/g;
}
напр.
$ echo 'aöæaæaæa' | perl match.pl æa -
2
4
6
(Последний сценарий работает только для стандартного ввода. Кажется, мне трудно заставить Perl обрабатывать все файлы как UTF -8.)