我可能只是遗漏了一些简单的东西但是s///
没有将更改的字符串分配给我的变量。我尝试了一个更简单的s///
,它确实有效。
如果超过三个,则此示例应修剪小数点后的任何数字。
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"
编辑:如果第三个数字为零,则应在两位数后修剪它。
“对股票价格进行整理: ...始终取小数点后的前两位数,并且只有在不为零时才取第三位数。然后,删除任何其他数字。
答案 0 :(得分:1)
你的替换是错误的。
$price =~ s/(\.\d\d[1-9]?)d*/$1/;
应该是
$price =~ s/(\.\d\d[1-9]?)\d*/$1/;
您自己的版本匹配,因为d*
可以匹配空字符串,因为在第三个小数位后面没有d
个字符
坚持任何第三个十进制数字必须为非零似乎很奇怪。所以0.00
很好,但0.000
不是,并且将被截断为前者。那是你的意图吗?
答案 1 :(得分:0)
实际上,你在最后一个“d”之前只错过了一个反斜杠。
将第一个替换指令更改为:
$price =~ s/(\.\d\d[1-9]?)\d*/$1/;