在文本文件中,我有许多行看起来像(a,b,c)
,其中a,b和c是双精度实数,例如(8.27605704077856,0.505526531790625,1.15577754382534e-05)
。在Perl中有一种简单的方法可以将小于10e-4的数字替换为0吗?
编辑例如,要处理的文本文件如下所示:
\plotinstruction[color,style,width]
points{
(8.27,0.5,1.1e-05)
(8.26,1,4.1e-06)
(8.25,1.5,3e-06)
}
我想写一个新文件:
\plotinstruction[color,style,width]
points{
(8.27,0.5,0)
(8.26,1,0)
(8.25,1.5,0)
}
答案 0 :(得分:3)
也许我错过了一些东西,但也许使用map
会有所帮助吗?
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @values = (8.27605704077856, 0.505526531790625, 1.15577754382534e-05);
my @filtered_values = map(($_ > 1e-4) ? $_ : 0, @values);
print Dumper \@filtered_values;
结果:
$VAR1 = [
'8.27605704077856',
'0.505526531790625',
0
];
要解析输入,您可以使用正则表达式提取逗号分隔的数字字符串,使用split
来获取运行map
的Perl列表。
答案 1 :(得分:0)
你可以写:
perl -pwe 's/\d[\d.e+-]+/$& < 0.001 && $& > -0.001 ? "0" : $&/ge' < INPUT > OUTPUT
(-p
表示在输入中读取,一次一行,进入$_
,运行程序,打印$_
,然后重新循环; -w
启用警告; -e
表示程序直接指定为命令行参数; s///
是正则表达式替换; /g
表示它是“全局”替换;并且{{ 1}}表示替换文本应该被视为一个完整的Perl表达式,而不是仅仅作为一个带有变量插值的字符串。)