2013-06-11 2 views
0

나는 한 번에 하나의 파일 만 PDB 데이터베이스를 통해 정렬하도록 Perl 프로그램을 만들려고 노력해 왔습니다. 필자가 필요로하는 것은 파일을 읽고, 패턴 매칭을 수행하며, 결과에 따라 파일 이름을 변경하지 않고 파일을 적절한 폴더로 이동시키는 프로그램입니다.perl을 사용하여 PDB 파일 정렬

#!/usr/bin/perl 
use File::Basename; 

@files = <top8000/rands/*> ; 
$file = 0; 
$count = 1; 
while (open (FILE, $files[$file])) 
{ 
    while ( $FILEREAD = <FILE>) 
    { 
     if ($FILEREAD =~ "pattern") 
     { 
      $count++;   
     }; 
    }; 
    $string ="$files[$file]"; 
    $filename = fileparse($string); 
    if ($count >=2) { 
     rename ($files[$file] , "top8000/randsort/$filename.txt"); 
    }; 
    $count = 1; 
    $file++; 
}; 

나는 내가 여기에 $string$filename 변수 전에 my를 사용하는데있어 알고 있지만, 내 프로그램이 실행되지 않으며, 그렇게하지 : 지금까지, 나는이 함께 왔어요 그것이 무엇을하는지 정말로 이해한다. 그 외에는 내 프로그램에 무엇이 잘못되었는지 알 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

실제로'file'와'count' (달러 기호가없는 변수'$ file')가 잘못 되었습니까? 아니면 그냥 복사/붙여 넣기 문제입니까? – TLP

+0

"파일 이름을 변경하지 않고"라고 말하면 실제로 "확장명을 '.txt'로 추가하여 파일 이름을 변경 했습니까? 이 경우 중요한 차이점이 있습니다. – TLP

+0

오 ... 그걸 고쳤습니다. 아직도 아무것도. 이 경우 원본 파일은 .txt 파일입니다. 나는 파일 이름을 전혀 바꾸지 않고 의미했다. – user2474041

답변

1

글쎄, 당신은 혼자 일을 복잡하게 만드는 것처럼 보입니다. 나는 지금 당신의 문제가 당신이 읽는 것을 위해 열린 파일의 이름을 바꾸려고한다는 것을 짐작할 것이다. 일반적으로 이러한 오류는 종종 치명적인 고려되어야하기 때문에

open my $fh, "<", $file or die "Cannot open file: $!"; 
rename $old, $new or die "Cannot rename: $!"; 

: 일반적으로, 당신은 항상이 같은 모든 파일의 상호 작용의 반환 값을 확인해야합니다.

귀하의 프로그램은 일부 기능이 내장 사용하여 상당히 단순화 할 수있다

:

use strict; 
use warnings; # always use these two 
use File::Copy qw(move); 

@ARGV = <top8000/rands/*.txt> unless @ARGV; # default args  
my $outdir = "top8000/randsort"; 

while (<>) {   # read through the files 
    if (/pattern/) { # check each line 
     close ARGV; # close the file handle 
     move $ARGV, $outdir or die "Cannot move $ARGV: $!"; 
    } 
} 

당신이 볼 수 있듯이 File::Copy 모듈을 사용하는 경우, 파일 이름을 지정할 필요가 없습니다 : 대상 주소가있는 경우 폴더에는 이전 이름이 사용됩니다.

@ARGV에있는 스크립트에 대한 인수로 제공된 파일을 열고 표준 입력 STDIN 파일 핸들을 사용하거나이 경우에는 열어 놓은 다이아몬드 연산자 <>을 사용하고 있습니다. 그리고 이것이 Perl이기 때문에 우리는 원하는 것을 할 수 있고, 아무 것도 없다면 기본 인수를 넣을 수 있습니다.

하나 이상의 조회가 확인되었으므로 첫 번째 경기에서 파일을 이동하는 것과 사실상 동일합니다. 왜 그렇게하지 않습니까? 먼저 파일을 닫아야합니다! 이 경우 파일 핸들은 ARGV입니다. 이것은 또한 다음 파일로 건너 뛰고 @ARGV으로 우리에게 매우 편리합니다. 파일 이름은 $ARGV에 포함되어 있으므로 더 이상 조작 할 필요가 없으므로 더 이상 File::Basename 모듈이 필요하지 않습니다.

File::Copy은 Perl 5의 핵심 모듈이므로 설치가 필요하지 않습니다.