2014-11-09 218 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