perl无法使用Unlink删除文件

时间:2014-11-09 07:19:05

标签: perl

我正在使用一个perl脚本,它将目录名作为用户输入并搜索其中的文件。搜索文件后,它会读取文件的内容。如果文件内容包含单词“cricket”,那么使用unlink函数我应该能够删除该文件。但是在执行代码后,使用unlink包含单词“cricket”的文件仍然存在于目录中。请帮忙。我的代码是:

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";
    }
}

1 个答案:

答案 0 :(得分:3)

通过您的测试if($count==0) {...},只有当包含&#34;板球&#34;时,您才会删除文件。如果您将其更改为if($count) {...},它应该按照您的描述工作。

此外,您通过以某种方式连接目录和文件名来创建文件路径,只有当用户输入的目录名称包含尾部斜杠时,才会起作用 ${dir}${file} ):这会像$dir/$file那样容易出错,或者,如果你想去城里:

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

此外,正如评论所指出的那样,无论您是否尝试删除它,都不会关闭打开的文件句柄。这是不好的做法,但是,在Linux上至少它应该仍然有用。在删除测试之前使用close($fh)

另请注意&#34;板球&#34;区分大小写,所以文件与&#34; Cricket&#34;不会被删除。使用$row =~ /cricket/i进行不区分大小写的搜索。