2012-10-29 10 views
13

Warum sind die beiden gedruckten Zahlen unterschiedlich?Ersetzung mit leerer Zeichenfolge: unerwartetes Ergebnis

#!/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>"; 

Ausgang:

A: <110110110110111> 
B: <11111111111> 

Antwort

15

Zitat man perlop:

Wenn das Muster auf die leere Zeichenfolge auswertet, die zuletzt erfolgreich ausgeführt reguläre Ausdruck wird stattdessen verwendet.

Versuchen eine erfolgreiche Regex vor dem zweiten Wechsel einzufügen, um zu sehen, was los ist:

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

Ich würde sagen, diese veraltet sein sollte und gewarnt durch use warnings, ist es schwer, die Vorteile zu sehen .

+7

Beachten Sie, dass \ Q \ E und Interpolation Zeichenfolgenoperationen sind, die nicht Teil der regulären Regex sind, da sie alle aufgelöst werden, bevor der Test "Muster wird auf leere Zeichenfolge ausgewertet" wird. Wenn Sie dieses Fehlverhalten wirklich verhindern wollen und Ihre Regex nur aus interpolierten Bits besteht, die alle leer sein können, werfen Sie ein '(? #)' Ein, das keinen Effekt auf das Matching hat, aber das Muster nicht leer macht. – ysth