2012-10-29 2 views
13

Perché i due numeri stampati sono diversi?Sostituzione con stringa vuota: risultato inatteso

#!/usr/bin/env perl 
use warnings; 
use 5.10.1; 

my $sep = ''; 
my $number = 110110110110111; 

$number =~ s/(\d)(?=(?:\d{3})+\b)/$1$sep/g; 
say "A: <$number>"; 

$number =~ s/\Q$sep\E//g; 
say "B: <$number>"; 

uscita:

A: <110110110110111> 
B: <11111111111> 

risposta

15

Quota man perlop:

Se il modello restituisce la stringa vuota, l'ultimo successo espressione regolare eseguito viene usato preferibilmente.

tenta di inserire un match regex successo prima della seconda sostituzione per vedere cosa sta succedendo:

(my $foo = '1') =~ s/1/x/; # successfully match “1” 
$number =~ s///g;   # now you’re deleting all 1s 
say "B: <$number>";  # <0000> 

direi che questo dovrebbe essere deprecato e ha messo in guardia da use warnings, è difficile vedere i benefici .

+7

Nota che ciò dimostra che \ Q \ E e l'interpolazione sono operazioni di stringa, non parte dell'espressione regolare vera e propria, poiché sono tutte risolte prima del test "modello valuta alla stringa vuota". Se vuoi veramente prevenire questa disfunzione e la tua regex consiste solo di bit interpolati che possono essere tutti vuoti, lancia un '(? #)' Che non ha alcun effetto sulla corrispondenza, ma rende il pattern non vuoto. – ysth