在Mastering Perl的“高级正则表达式”一章中,我有一个损坏的示例,我无法找到一个很好的修复方法。这个例子可能是为了自己的利益而试图过于聪明,但也许有人可以为我解决它。里面可能有这本书的免费副本,用于修复工作。:)
在讨论环视的部分中,我想使用否定的环视来实现带有小数部分的数字的 commifying 例程。关键是要使用负面的回顾,因为那是主题。
我愚蠢地这样做了:
$_ = '$1234.5678';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g; # $1,234.5678
(?<!\.\d)
断言 之前的位不是(?=(?:\d\d\d)+\b)
小数点和数字。
愚蠢的事情是没有努力去打破它。通过在末尾添加另一个数字,现在有一组三个数字,前面没有小数点和一个数字:
$_ = '$1234.56789';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g; # $1,234.56,789
如果在 Perl 中lookbehinds 可以是可变宽度,这将非常容易。但他们不能。
请注意,在没有负面回顾的情况下很容易做到这一点,但这不是示例的重点。有没有办法挽救这个例子?