在下面的脚本中,我试图保留小数部分和前2个小数部分,如果它大于0则保留第三个小数部分。 所以应将12.37500000000392替换为12.375
#!/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";
但它不起作用。
它显示$1
为12
而$2
为.375
,但最后12.37500000000392
语句中的价格仍显示为print
答案 0 :(得分:4)
问题在于最后的不合理重复。只需使用
$price =~ s/([0-9]+)(\.[1-9]{2}[1-9]?)\d*/$1$2/;
由于?
使*
匹配尽可能少重复 - 并且模式结尾处没有其他条件可以使其失败 - 重复\d
0次是最少的,所以剩下的数字根本就不匹配,因此不会被替换。
请注意,如果前两位数之一为零,则您的模式根本不匹配。你可能想用
$price =~ s/([0-9]+)(\.[0-9]{2}[1-9]?)\d*/$1$2/;
此外,如果您稍后不需要整数和小数部分,您可以稍微简化整个事情:
$price =~ s/([0-9]+\.[0-9]{2}[1-9]?)\d*/$1/;
答案 1 :(得分:1)
你可以用:
$price =~ s/\.\d{2}[1-9]?\K\d*//;