2014-11-09 212 views
1

我正在使用將目錄名稱作爲用戶輸入並在其中搜索文件的perl腳本。搜索文件後,它讀取文件的內容。如果文件內容包含一個單詞「板球」,然後使用取消鏈接功能,我應該能夠刪除該文件。但是使用unlink之後,包含單詞「cricket」的文件在執行代碼後仍然存在於目錄中。請幫忙。我的代碼是: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 2014-11-09 07:29:47

+0

看起來你正試圖「解開」一個打開的文件。 – 2014-11-09 07:30:45

回答

3

通過測試if($count==0) {...}你只是刪除文件,如果他們包含「蟋蟀」。如果將其更改爲if($count) {...},它應該如您所描述的那樣工作。

而且你通過連接的方式將目錄和文件名創建的文件路徑,將如果用戶輸入的目錄名稱中包含尾隨斜線${dir}${file})只工作:這將是不太容易出錯$dir/$file,或者,如果你想要去的城市:

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

此外,作爲評論指出的那樣,你不關閉打開的文件句柄,你是否嘗試將其刪除。然而,這是不好的做法,至少在Linux上它仍然可以工作。在刪除測試之前使用close($fh)

請注意,「板球」區分大小寫,因此帶有「板球」的文件不會被刪除。使用$row =~ /cricket/i進行不區分大小寫的搜索。

+0

好的謝謝..如果我改變這也即如果($計數)仍然不能正常工作 – user2775241 2014-11-09 07:38:42

+0

有沒有什麼辦法可以通過在他們之間放置/(斜線)來協調dir名稱和文件名? – user2775241 2014-11-09 07:41:23

+0

@ user2775241:這就是'File :: Spec :: catfile'應該以獨立於操作系統的方式執行的操作。 – Mikesname 2014-11-09 07:48:25