替换Perl中的小数字

时间:2012-10-11 01:43:04

标签: perl numbers

在文本文件中,我有许多行看起来像(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)
}

2 个答案:

答案 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表达式,而不是仅仅作为一个带有变量插值的字符串。)