2012-12-06 2 views
3

저는 Perl을 처음 사용하고 있으며 파일을 검색하고 추가 입력 파일에서 여러 문자열을 확인/일치시키는 스크립트를 작성하려고합니다. 여기에 지금의로이 무엇 : 기본적으로Perl 입력 파일 문자열 일치

#! /css/dvltools/localperl/bin/perl 

open CUMRT603, "CUMRT603"; 

my $meter, $my_cur_line; 
while (<CUMRT603>) 
{ 
     $my_cur_line = $_; 
     chomp $my_cur_line; 

     open METER_LIST, "mlist"; 
     while (<METER_LIST>) 
     { 
       $meter = $_; 
       if ($my_cur_line =~ /"$meter"/) 
       { 
         print "Found $meter on $my_cur_line"; 
       } 
     } 

     close METER_LIST; 
} 

, 나는 목록 (mlist)에서 발견 된 문자열을 CUMRT603을 찾고 있어요. 문자열 일치를 표시 할 수 없습니다 (적어도 하나는 있어야합니다). 문법, 구조 등에 관한 조언은 권고됩니다. 이것은 기본적으로 나의 첫 번째 펄 스크립트이다.

+0

첫 번째 줄의 각 줄마다 두 번째 파일을 다시 읽을 필요가 없습니다. 비효율적입니다. 그리고'grep -Fx file1 file2' bash 명령으로 파일 교차점을 찾을 수 있기 때문에 여기에서는 Perl을 사용할 필요가 없습니다. – raina77ow

답변

2

$meter 입력에 chomp이 없으므로 아마도 $my_cur_line 변수와 일치 할 수 없습니다. $meterfoo 경우, 그것은 당신이 원하는 확실하지 않다 "foo"을 일치하려고합니다 그래서

는 또한, 당신의 정규식에서 그 따옴표는 문자 그대로 해석됩니다.

또한 일치하는 텍스트에 메타 문자가 사용되지 않게하려면 quotemeta 또는 \Q ... \E을 사용하십시오.

그래서, 짧은에, 당신의 코드는 아마되어야합니다 : 또한 정말

use strict; 
use warnings; 

짧은 학습 곡선 디버깅에 저장된 시간을 최대 무게 이상을 사용해야합니다

chomp $meter; 
if ($my_cur_line =~ /\Q$meter\E/) 

.

+0

메타 문자가 무슨 뜻인지 설명해 주시겠습니까? – TyC

+2

@TyC 음, 예를 들어 문자열'foo? '가있는 경우 regex는 "fo 다음에 선택적인 o"를 의미하는 반면 "foo 다음에 물음표"를 의미 할 수 있습니다. 메타 문자를 이스케이프 처리하면 문자 그대로 해석됩니다. – TLP

+0

그래서 '$ meter'가 아닌 $ meter 변수를 명시 적으로 말하고 있습니까? – TyC

2

"제대로 작동하지 못합니다"는 의미가 필요합니다. 네가 그것을 실행할 때 어떻게 될까? 어떤 결과가 있습니까? 어떤 결과를 기대 했습니까?

하나의 큰 문제는 사용자가 open의 결과를 확인하지 않는다는 것입니다. 파일을 열 수 없으면 아무 것도 제대로 작동하지 않습니다. <CURMT603>에서 아무런 결과가 나타나지 않으며 즉시 바깥 쪽 while 루프를 종료합니다. 같은 열리는 METER_LIST 엽니 다.

또한, 당신은 당신이 오타를 잡을 수 있도록 프로그램의 상단에

use warnings; 
use strict; 

을 넣어해야합니다. 그렇지 않으면 Perl은 여러분이 더 잘 알고 있다고 가정하기 때문에 일들을 미끄러지게 할 것입니다. 그러나 여기서는 그렇지 않습니다.

세 번째로 인수가있는 형식 인 open을 사용하고 어휘 파일 핸들을 사용합니다.

넷째, 변수를 직접 읽을 수 있습니다. $_에서 배정 할 필요가 없습니다.

여기에 재빨리 재 작성한 내용이 있습니다.

use warnings; 
use strict; 

open(my $cur_file, '<', 'CURMT603') or die "Unable to open CURMT603: $!"; 

while (my $cur_line = <$cur_file>) { 
    chomp $cur_line; 
    open(my $meter_file, '<', 'mlist') or die "Can't open meter file: $!"; 
    while (my $meter = <$meter_file>) { 
     if ($my_cur_line =~ /"$meter"/) { 
      print "Found $meter on $my_cur_line\n"; 
     } 
    } 
    close $meter_file; 
} 
close $cur_file; 

그래서 새로운 파일 처리 및 오류 검사로 시도해보십시오. 파일에 오류 검사를 추가하면 문제가 나타납니다.

최종 참고 사항 : CURMT603 파일을 통해 매번 동일한 mlist 파일을 반복해서 다시 읽을 필요는 없지만 다른 시간대에 최적화되어 있습니다.

+0

three-arguement 양식을 사용하여 파일을 여는 것의 이점은 무엇입니까? – TyC

+1

더 명확하고, 특수 문자가있는 파일 이름에 대해 걱정할 필요가 없습니다. –

+2

음 ... 어휘 파일 핸들의 이점은 전역이 아니며 범위를 벗어날 때 자동 종료된다는 것입니다. 명시 적 열기 모드는 동적이고 때로는 위험한 열기 모드가 사용되는 것을 방지합니다. 예를 들어'open FOO, $ bar'는'$ bar = " TLP