Regex 《掌握正则表达式》一书中的Perl替换示例不适用于我

Regex 《掌握正则表达式》一书中的Perl替换示例不适用于我,regex,perl,Regex,Perl,我可能只是缺少了一些简单的东西,但是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

我可能只是缺少了一些简单的东西,但是
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"
编辑:如果第三个数字是零,则应在两个数字后对其进行修剪

“美化股价:
…始终取小数点后的前两位,仅当第三位不为零时才取第三位。然后,删除任何其他数字。

您的替换错误

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

$price =~ s/(\.\d\d[1-9]?)\d*/$1/;
您自己的版本匹配是因为
d*
可以匹配空字符串,这是因为第三位小数后没有
d
字符


坚持任何第三个十进制数字都必须是非零似乎有些奇怪。因此
0.00
可以,但
0.000
不能,并且将被截断为前者。这是您想要的吗?

事实上,您在最后一个“d”之前只漏掉了一个反斜杠

将第一条取代基指令更改为:

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

应该是
\d
而不是
d
。除了缺少反斜杠外,RE看起来不正确--
12.340123
的输出是什么?就是这样。谢谢@Benjamin W。这是书中的正则表达式:!O'Reilly电子书经常弄乱源代码,以我的经验来看。我总是在下载时仔细检查PDF版本有疑问(而且它是可用的)。谢谢你,就是这样!“美化股票价格总是取小数点后的前两位数字,只有当它不为零时才取第三位数字。然后,删除任何其他数字。”这是一个问题。如果你读过技术书籍、IETF RFC或类似书籍,检查勘误表总是一个好主意。