2012-07-05 2 views
0

설정 파일을 읽고 파일에 언급 된 크기로 나열된 디렉토리를 삭제하려고합니다. 지금까지 나는 for 루프와 this-프로그램 로직에서 도움이 필요합니다.

open FILE, 'C:\reports\config.txt' or die $!; 
my $size_req; 
my $path; 
my $sub_dir; 
my $count; 

my @lines = <FILE>; 
foreach $_ (@lines) 
{ 



    my @line = split /\|/, $_; 

    if ($line[0] eq "size") 
    { 
     $size_req= $line[1]; 
     $size_req= ">".$size_req*1024;; 

    } 

    if ($line[0] eq "path") 
    { 
     $path= $line[1]; 

    } 

    if ($line[0] eq "directories") 
    { my $aa; 
     my $siz_two_digit; 
     my $sub_dir; 
     my $i; 
     my [email protected]; 
     **for($i=1; $i < $array_size;)** 
     { 
     $sub_dir=$line[$i]; 
     print $sub_dir; 
     print "\n"; 
     print $path; 
        print "\n"; 
     my $r1 = File::Find::Rule->directory 
          ->name($sub_dir) 
          ->prune   # don't go into it 
          ->discard;  # don't report it 

       my $fn = File::Find::Rule->file 
             ->size($size_req); 

          my @files = File::Find::Rule->or($r1, $fn) 
              ->in($path); 

        print @files; 
        undef @files; 
         print @files; 
        $i++; 
        print "\n"; 
        print "\n"; 
     } 
    } 

} 

문제를이 모든 하위 디렉토리가 잘 배열에서 폐기 될 저장 독일인의되어 있습니다. 그러나 삭제할 첫 번째 디렉토리의 이름을 읽을 때 나머지 하위 디렉토리에 대해 알지 못하고 목록도 표시됩니다. 두 번째 값으로 이동하면 이전 값을 무시하고 그 값도 나열합니다.

File | :: Find :: Rule이 한 번에 배열을 가져 와서 코드가 구성 파일의 전체 행을 한꺼번에 고려하는지 알 수 있습니까? 또는 다른 논리?

my $r1 = File::Find::Rule->directory 
        ->name($sub_dir) 
        ->prune   # don't go into it 
        ->discard;  # don't report it 

당신은 스칼라의 규칙을 저장하기 위해 노력하고있다,하지만 당신이 실제로하고있는 것은 찾기 호출 :: 파일 :

이 코드는 당신이 생각하지 않는 당신에게

+1

아마도 입력 파일 형식의 샘플입니까? –

+0

모든 스크립트에서'use strict'와'use warnings'을 권합니다. 또한 @LenJaffe가 제안한대로 입력 파일의 샘플을 게시하십시오. – simbabque

답변

0

감사합니다 : 규칙을 만들고 결과 목록을 정수 (목록의 요소 수)로 변환하고이를 $ r1에 저장합니다.

전체 호출을 @files 호출에 넣으십시오. 지저분 해 보일 수도 있지만 훨씬 더 잘 작동합니다.