1

次のスクリプトでは、小数部分と最初の 2 つの小数部分、および 0 より大きい場合は 3 番目の部分を維持しようとしています

#!/usr/bin/perl  

use strict;  
use warnings;  

my $price = 12.37500000000392;  
print "price = $price \n";  
$price =~ s/([0-9]+)(\.[1-9]{2}[1-9]?)\d*?/$1$2/;   

print "1 = $1 \n";  
print "2 = $2 \n";  
print "price = $price \n"; 

しかし、うまくいきません。
それは$1is12$2isを示していますが、最終的な価格は最後のステートメントのように.375まだ印刷されています12.37500000000392print

4

2 に答える 2

4

問題は、最後の貪欲な繰り返しです。使うだけ

$price =~ s/([0-9]+)(\.[1-9]{2}[1-9]?)\d*/$1$2/;

は一致を可能な限り少ない繰り返しで行い、パターンの最後に失敗する可能性のある条件がないため、 の 0 回の繰り返しが?可能な限り少ないため、残りの数字は単に一致することはなく、したがって置換されません。 .*\d

最初の 2 桁のいずれかがゼロの場合、パターンはまったく一致しないことに注意してください。あなたはおそらく使いたかった

$price =~ s/([0-9]+)(\.[0-9]{2}[1-9]?)\d*/$1$2/;

また、後で整数部分と小数部分が必要ない場合は、次のように全体を少し単純化できます。

$price =~ s/([0-9]+\.[0-9]{2}[1-9]?)\d*/$1/;
于 2013-08-18T16:07:46.680 に答える
1

あなたはそれを行うことができます:

$price =~ s/\.\d{2}[1-9]?\K\d*//;
于 2013-08-18T16:46:41.143 に答える