我正在练习一个Perl正则表达式问题,其中有以下格式的行可以从stdin中读取:
我花了13.50美元,买了2.3公斤橙子。
从城市到大海需要4.5个小时。
她于2010年搬家,并于2014年离开。
我必须将每行中的所有十进制数字转换为最接近的整数。因此,预期的输出将如下所示:
我花了14.00美元买了2公斤橙子。
从城市到大海要花费5个小时。
她于2010年搬家,并于2014年离开。
我有以下代码:
#!/usr/bin/perl -w
use strict;
use warnings;
use Math::Round;
my @lines = <STDIN>;
chomp @lines;
foreach my $line (@lines) {
$line =~ s/(\d+\.?\d*)/hello/g;
}
我不确定该怎么做的部分实际上是用其整数版本替换每行中的十进制数字。我的方法是将stdin中的所有行读入数组,然后对每行中的每个匹配项将十进制数替换为其最接近的整数。我知道您可以使用round()函数在Perl中对浮点数进行四舍五入。
但是,不能将round()函数用作's /(\ d +。?\ d *)// g'中的替换文本。使用替代运算符似乎是最简单的方法,但我认为我将无法使用它。 我不确定我可以使用其他什么方法来解决此问题。任何见解将不胜感激。
答案 0 :(得分:2)
使用s///e
将代码作为替换表达式。该代码应返回用作替换的值。
s/(\d+\.\d+)/ sprintf("%.0f", $1) /eg
(如果愿意,可以随意使用Math :: Round的round
。我只是使用了我熟悉的语言。)