perl regex-将一行中的多个十进制数转换为最接近的整数
我正在练习一个Perl正则表达式问题,其中有从stdin读入的以下格式的行: 我花了13.50美元买了2.3公斤橘子 从城市到海边需要4.5个小时 她于2010年搬家,2014年离开 我必须将每行中的所有十进制数转换成最接近的整数。因此,预期输出如下所示: 我花14美元买了2公斤橘子 从城市到海边需要5个小时 她于2010年搬家,2014年离开 我有以下代码:perl regex-将一行中的多个十进制数转换为最接近的整数,regex,perl,Regex,Perl,我正在练习一个Perl正则表达式问题,其中有从stdin读入的以下格式的行: 我花了13.50美元买了2.3公斤橘子 从城市到海边需要4.5个小时 她于2010年搬家,2014年离开 我必须将每行中的所有十进制数转换成最接近的整数。因此,预期输出如下所示: 我花14美元买了2公斤橘子 从城市到海边需要5个小时 她于2010年搬家,2014年离开 我有以下代码: #!/usr/bin/perl -w use strict; use warnings; use Math::Round; my @l
#!/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;
}
#/usr/bin/perl-w
严格使用;
使用警告;
使用数学::轮;
我的@lines=;
咬线;
foreach my$行(@行){
$line=~s/(\d+\.?\d*)/hello/g;
}
我不知道该怎么做的部分是用整数替换每行中的十进制数。我的方法是将stdin中的所有行读取到一个数组中,然后用最接近的整数替换每行上的每个匹配项。我知道可以使用round()函数在Perl中对浮点数进行四舍五入
但是,使用round()函数作为“s/(\d+。?\d*)//g”中的替换文本将不起作用。使用替换运算符似乎是最简单的方法,但我认为我无法使用它。
我不确定还有什么其他方法可以解决这个问题。任何见解都将不胜感激。使用
s///e
将代码作为替换表达式。代码将返回用作替换的值
s/(\d+\.\d+)/ sprintf("%.0f", $1) /eg
(如果你愿意,可以随意使用Math::Round的Round
。我只是用了我熟悉的方法。)你说“整数”,但给出14.00美元的例子?如果您真的想将价格四舍五入到0美分,您需要修改@ikegami解决方案,可能需要添加可选的美元匹配(\$?)
,然后在替换中有两种情况,s/./$1?到零美分:到int/ge
。执行上述“零美分”的一种笨拙方法是嵌套sprintf
,一个用于舍入另一个用于精度:s/(\$?)(\d+\.\d+/$1$1.sprintf(“%.2f”,sprintf“%.0f”,$2):sprintf(“%.0f”,$2)/ge
。还有其他方法。