2012-10-29 16 views
13

Dlaczego dwie drukowane liczby są różne?Zamienianie na pusty ciąg znaków: nieoczekiwany wynik

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

wyjściowa:

A: <110110110110111> 
B: <11111111111> 

Odpowiedz

15

Cytat man perlop:

Jeśli wzór ma wartość pusty ciąg, ostatni z powodzeniem wykonywane wyrażenie regularne jest używany zamiast.

próby wstawienia jednego udanego regex mecz przed drugim substytucji, aby zobaczyć, co się dzieje:

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

powiedziałbym, że to powinno być przestarzałe i ostrzegł o przez use warnings, trudno dostrzec korzyści .

+7

Należy zauważyć, że to pokazuje, że \ Q \ E i interpolacja są operacjami łańcuchowymi, a nie częścią właściwego wyrażenia regularnego, ponieważ wszystkie one są rozstrzygane przed testem "wzorzec ocenia na pusty ciąg". Jeśli naprawdę chcesz zapobiec temu błędowi, a twoje wyrażenie regularne składa się z tylko interpolowanych bitów, które mogą być puste, podaj '(? #)', Które nie ma wpływu na dopasowanie, ale sprawia, że ​​wzór nie jest pusty. – ysth

Powiązane problemy