ho la (quello che credo di essere) negativo lookahead<@> *(?!QQQ)
che mi aspetto per abbinare se la stringa testato è un <@>
seguito da qualsiasi numero di spazi (a zero compreso) e quindi non seguito da QQQ
.negativo asserzione che guarda avanti con l'* modificatore in Perl
Tuttavia, se la stringa testata è <@> QQQ
, l'espressione regolare corrisponde.
Non riesco a capire perché questo è il caso e gradirei qualsiasi aiuto in merito.
Ecco uno script di test
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;
}
Questo stampa
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
E mi sarei aspettato la prima linea ad essere something <@> QQQ --> something at w/ QQQ
.
'(? = \ S)' dovrebbe essere '(? = [^])' (Nel caso in cui il carattere successivo sia una scheda). In realtà dovrebbe essere '(?!)' (Nel caso sia la fine della stringa). – ikegami
Grazie per la cattura e modifica, @ikegami. –