У меня есть (что я считаю) условного выражением<@> *(?!QQQ)
, что я ожидал, чтобы соответствовать, если тестируемой строка является <@>
следует любому количество пробелов (ноль в том числе) и затем не, а затем QQQ
.Отрицательное опережение утверждения с * модификатором в Perl
Тем не менее, если тестируемая строка <@> 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
.
'(? = \ S)' должно быть '(? = [^])' (В случае, если следующий символ является вкладкой). На самом деле это должно быть '(?!)' (В случае, если это конец строки). – ikegami
Спасибо за улов и редактирование, @ikegami. –