我正在使用一个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";
}
}
答案 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
进行不区分大小写的搜索。