2014-11-09 4 views
1

사용자의 입력으로 디렉토리 이름을 가져 와서 파일을 검색하는 펄 스크립트를 사용하고 있습니다. 파일 검색 후 파일의 내용을 읽습니다. 파일 내용에 "크리켓"이라는 단어가 포함되어있는 경우 링크 해제 기능을 사용하면 파일을 삭제할 수 있습니다. 그러나 unlink을 사용하면 "cricket"이라는 단어가 포함 된 파일은 코드 실행 후 여전히 디렉토리에 있습니다. 도와주세요. 내 코드는 다음과 같습니다 그들은 "크리켓"를 포함하지 할 경우 테스트 if($count==0) {...}으로perl이 Unlink를 사용하여 파일을 삭제할 수 없습니다.

use strict; 
use warnings; 
use File::Basename; 

print "enter a directory name\n"; 
my $dir = <>; 
print "you have entered $dir \n"; 
chomp($dir); 
opendir DIR, $dir or die "cannot open directory $!"; 

while (my $file = readdir(DIR)) { 
    next if ($file =~ m/^\./); 
    my $filepath = "${dir}${file}"; 
    print "$filepath\n"; 
    print " $file \n"; 

    open(my $fh, '<', $filepath) or die "unable to open the $file $!"; 
    my $count = 0; 
    while (my $row = <$fh>) { 
     chomp $row; 
     if ($row =~ /cricket/) { 
      $count++; 
     } 
    } 

    print "$count"; 

    if ($count == 0) { 
     chomp($filepath); 
     unlink $filepath; 
     print " $filepath deleted"; 
    } 
} 
+0

해당 파일에 쓸 수있는 권한이 있습니까? – McKracken

+0

열려있는 파일의 '연결 해제'를 시도하는 것 같습니다. –

답변

3

당신은 파일 만 삭제됩니다. if($count) {...}으로 변경하면 설명대로 작동합니다.

은 또한 당신은 사용자가 입력 한 디렉토리 이름이 뒤에 슬래시 (${dir}${file})을 포함하는 경우 그 에만 작동하는 방식으로 디렉토리와 파일 이름을 연결하여 파일 경로를 만드는이 덜 오류가 발생하기 쉬운 같은 것 $dir/$file, 또는 당신이 마을에 가고 싶어 경우 : 코멘트 지적으로 당신이 그것을 삭제하려고 여부를

use File::Spec; 
File::Spec::catfile($dir, $file); 

또한, 당신이, 열린 파일 핸들을 닫는 아닙니다. 그러나 이것은 적어도 Linux에서는 여전히 작동해야한다는 나쁜 관행입니다. 삭제 테스트 전에 close($fh)을 사용하십시오.

"크리켓"은 대소 문자를 구분하므로 "크리켓"이있는 파일은 삭제되지 않습니다. 대/소문자를 구분하지 않으려면 $row =~ /cricket/i을 사용하십시오.

+0

고마워요. .. 만약 내가 (즉, $ count) 여전히 작동하지 않습니다. – user2775241

+0

거기에/(슬래시)를 삽입하여 dir 이름과 파일 이름을 concatinate 수있는 방법이 있습니까? – user2775241

+0

@ user2775241 : 그것은'File :: Spec :: catfile'이 OS 독립적 인 방식으로해야 할 일입니다. – Mikesname

관련 문제