Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl regex-将一行中的多个十进制数转换为最接近的整数_Regex_Perl - Fatal编程技术网

perl regex-将一行中的多个十进制数转换为最接近的整数

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

我正在练习一个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 @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
。还有其他方法。