2012-10-11 3 views
0

텍스트 파일에서 (a,b,c)과 같은 많은 행이 있는데, 여기서 a, b 및 c는 배정 밀도 실수입니다 (예 : (8.27605704077856,0.505526531790625,1.15577754382534e-05)). Perl에서 10e-4보다 작은 숫자를 0으로 대체하는 간단한 방법이 있습니까?은 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 
     ]; 

입력을 구문 분석하려면, 당신은에 map를 실행하는 펄 목록을 가져가에 split를 사용하여, 숫자의 쉼표로 구분 된 문자열을 추출하는 정규 표현식을 사용할 수 있습니다.

+0

덕분에, 그것은 유망 해 보이지만, 모든 라인이 세 개의 숫자로 된 것은 아닙니다. 그래서 라인이'('. 지금 코드가 거의 실패합니다. – pluton

+0

당신은 입력 예제를 제공하지 않았기 때문에'map' 사용법에 대한 일반적인 아이디어를주었습니다. 입력을 파싱하는 방법은 당신에게 달렸습니다. 입력 한 내용을'values'의 목록으로 쉽게 파싱하고'values'를'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 식으로 처리해야 함을 의미합니다. 단순한 변수 보간법이있는 문자열입니다.)

관련 문제