2012-10-29 11 views
13

2つの数字が異なるのはなぜですか?空の文字列による置換:予期しない結果

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

出力:

A: <110110110110111> 
B: <11111111111> 

答えて

15

引用man perlopは:

パターンは空の文字列に評価された場合、最後に正常に実行 た正規表現が代わりに使用されています。

何が起こっているかを確認するために第2の置換の前に1個の成功した正規表現の一致を挿入しよう:

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

私は、これは非推奨とuse warningsによりについて警告しなければならないと言うだろう、それが利益を見ることは難しいです。

+7

これは\ Q \ Eと補間が正規表現の一部ではなく文字列演算であることを示していることに注意してください。 "パターンが空文字列に評価される"テストの前にすべて解決されるからです。本当にこの誤った形を防ぐために、あなたの正規表現は空であるかもしれない補間されたビットだけで構成されていれば、 '(?#)'を入れてもマッチングに影響はありませんが、パターンは空ではありません。 – ysth

関連する問題