0

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

2 回答 2

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它来获取要运行的 Perl 列表map

于 2012-10-11T01:50:47.103 回答
0

你可以写:

perl -pwe 's/\d[\d.e+-]+/$& < 0.001 && $& > -0.001 ? "0" : $&/ge' < INPUT > OUTPUT

(-p意味着一次一行地读入输入,$_运行程序,打印出来$_,然后再次循环;-w启用警告;-e意味着程序直接指定为命令行参数;s///是正则表达式替换;/g意味着它是一个“全局”替换;并且/e意味着替换文本应被视为完整的 Perl 表达式,而不是仅具有变量插值的字符串。)

于 2012-10-11T01:58:12.020 回答