Perl Regex -Получить смещение всех совпадений вместо одного

Я хочу найти файл для строки, а затем получить смещения для всех совпадений. Содержимое файла показано ниже:

sometext
sometext
AAA
sometext
AAA
AAA
sometext

Я читаю весь этот файл в строку $text, а затем выполняю регулярное выражение для AAAследующим образом:

if($text =~ m/AAA/g) {
    $offset = $-[0];
}

Это даст смещение только на один AAA. Как я могу получить смещение всех совпадений?

Я знаю, что мы можем получить все совпадения в массиве, используя такой синтаксис:

my @matches = ($text =~ m/AAA/g);

Но я хочу, чтобы смещение не соответствовало строке.

В настоящее время я использую следующий код для получения смещений всех совпадений:

my $text= "sometextAAAsometextAAA";
my $regex = 'AAA';
my @matches = ();

while ($text =~ /($regex)/gi){
    my $match = $1;
    my $length = length($&);
    my $pos = length($`);
    my $start = $pos + 1;
    my $end = $pos + $length;
    my $hitpos = "$start-$end";
    push @matches, "$match found at $hitpos ";
}

print "$_\n" foreach @matches;

Но есть ли более простой способ для этого?

5
задан AnonGeek 11 July 2012 в 19:32
поделиться