Утверждение отрицательного просмотра вперед с модификатором *в Perl

У меня есть (то, что я считаю)отрицательным прогнозным утверждением <@> *(?!QQQ), который, как я ожидаю, будет соответствовать, если проверяемая строка представляет собой <@>, за которой следует любое количество пробелов (ноль, включая ), а затем , а не , за которым следует QQQ.

Тем не менее, если тестируемая строка имеет вид <@> QQQ, регулярное выражение совпадает.

Я не понимаю, почему это так, и был бы признателен за любую помощь по этому вопросу.

Вот тестовый скрипт

use warnings;
use strict;

my @strings = ('something <@> QQQ',
               'something <@> RRR',
               'something <@>QQQ',
               'something <@>RRR' );


print "$_\n" for map {$_. " --> ". rep($_) } (@strings);



sub rep {

  my $string = shift;

  $string  =~ s,<@> *(?!QQQ),at w/o,;
  $string  =~ s,<@> *QQQ,at w/  QQQ,;

  return $string;
}

Это выводит

something <@> QQQ --> something at w/o  QQQ
something <@> RRR --> something at w/o RRR
something <@>QQQ --> something at w/  QQQ
something <@>RRR --> something at w/o RRR

И я ожидал, что первая строка будет something <@> QQQ --> something at w/ QQQ.

7
задан tchrist 29 August 2012 в 11:45
поделиться