2017-12-14 9 views
3

私はたぶん単純なものがありませんが、s///は変更された文字列を変数に割り当てていません。私はもっ​​と簡単なs///を試して、それは動作します。Mastering Regular ExpressionsのPerl置換の例が私のために働いていない

この例では、3つ以上ある場合は小数点以下の任意の桁をトリミングする必要があります。

my $price = 12.34567; 
print "$price\n"; 
$price =~ s/(\.\d\d[1-9]?)d*/$1/; 
print "$1\n";   # This is printing .345 correctly. 
print "$price\n";  # This should be 12.345 but is unchanged. 

my $story = "dog"; 
$story =~ s/(do)g/$1/; 
print "$story\n"; # This works. It's changed to "do" 

編集:3桁目がゼロの場合、2桁の数字の後にトリミングする必要があります。株価をPrettifying

」: ...常に小数点以下2桁を取り、それがゼロでない場合にのみ、3桁目を取るその後、他の桁を削除

+3

があるべき '\ D 'の代わりにD''の。 –

+1

バックスラッシュがありませんが、REは正しく表示されません。どの出力を '12.340123'に期待しますか? –

+0

それはそれでした。 @Benjamin W. [書籍の抜粋] – user3064085

答えて

1

あなたの置換。間違っている。

$price =~ s/(\.\d\d[1-9]?)d*/$1/; 

d*がいる、空の文字列を一致させることができますので、

$price =~ s/(\.\d\d[1-9]?)\d*/$1/; 

独自のバージョンが一致しなければなりません小数点第3位の後にd文字がないためです。

3桁の10進数のいずれもゼロでない必要があります。だから0.00は問題ありませんが、0.000はそうではなく、前者に切り詰められます。それはあなたが意図したものですか?

+1

はそれはそれは株価 は常に小数点以下2桁を取り、第三を取るPrettifying」 ![ブック画像](https://imgur.com/a/fy3zk) たありがとう数字がゼロでない場合にのみ次に、他の数字を削除してください。 " – user3064085

+0

これは[既知のエラッタ]です(http://www.oreilly.com/catalog/errata.csp?isbn=9780596528126#page81)。テクニカルブック、IETF RFCなどを読んだら、正誤をチェックすることは常に良い考えです。 – daxim

0

実際、最後の "d"の前にバックスラッシュのみが間違っていました。

変更最初substiturion命令へ:

$price =~ s/(\.\d\d[1-9]?)\d*/$1/; 
関連する問題