Tengo el (lo que creo que es) afirmación de búsqueda negativa hacia delante<@> *(?!QQQ)
que espero coincidir si la cadena de prueba es un <@>
seguido de cualquier número de espacios (cero incluidos) y luego no seguido de QQQ
.afirmación de búsqueda negativa hacia delante con el modificador * en Perl
Sin embargo, si la cadena probada es <@> QQQ
, la expresión regular coincide.
No veo por qué este es el caso y agradecería cualquier ayuda en este asunto.
Aquí es un script de prueba
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;
}
Esto imprime
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
Y yo habría esperado que la primera línea que se something <@> QQQ --> something at w/ QQQ
.
'(? = \ S)' debe ser '(? = [^])' (En caso de que el siguiente carácter sea una pestaña). En realidad, debería ser '(?!)' (En caso de que sea el final de la cadena). – ikegami
Gracias por la captura y edición, @ikegami. –