2012-10-11 46 views
0

取代小的數字在文本文件中,我有很多線路看起來像(a,b,c)其中a,b,c爲雙精度實數,例如(8.27605704077856,0.505526531790625,1.15577754382534e-05)。有沒有一種簡單的方法在Perl中用0替換小於10e-4的數字?在Perl

編輯:例如,待處理的文本文件的樣子:

\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) 
} 

回答

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

+0

謝謝,它看起來很有前途,但不是所有的行都是一組三個數字,所以它應該首先測試這行是否以'('開頭。現在你的代碼(幾乎)失敗了。 – pluton

+0

你沒有提供輸入的例子,所以我只是給你一個關於如何使用'map'的總體思路。如何解析輸入取決於您 - 您可以輕鬆地將輸入解析爲「值」列表並在其上運行「map」。 –

+0

是的,對不起,我編輯我的問題更加精確。我會看看'split'命令和你的建議。謝謝。 – pluton

0

你可以寫:

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

-p指一次在輸入閱讀,一條線,爲$_,運行該程序,再打印出來$_,並循環; -w使警告; -e意味着程序被直接指定爲命令行參數; s///是一個正則表達式取代; /g意味着它是一個「全球性」取代;和/e表示替換文本應當視爲完整的Perl表達式,而不是作爲僅具有可變插值的字符串)。