【问题标题】:perl not able to delete a file using Unlinkperl 无法使用 Unlink 删除文件
【发布时间】:2014-11-09 07:19:04
【问题描述】:

我正在使用一个 perl 脚本,该脚本将目录名称作为用户的输入并在其中搜索文件。搜索文件后,它会读取文件的内容。如果文件内容包含单词“cricket”,那么使用取消链接功能我应该能够删除该文件。但是使用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";
    }
}

【问题讨论】:

  • 你有写入那个文件的权限吗?
  • 看起来您正在尝试unlink 一个打开的文件。

标签: perl


【解决方案1】:

通过您的测试if($count==0) {...},您只会删除包含“cricket”的文件。如果您将其更改为 if($count) {...},它应该可以按照您的描述工作。

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

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

此外,正如 cmets 指出的那样,无论您是否尝试删除它,您都不会关闭打开的文件句柄。然而,这是一种不好的做法,至少在 Linux 上它仍然可以工作。在删除测试之前使用close($fh)

另请注意,“cricket”区分大小写,因此带有“Cricket”的文件不会被删除。使用$row =~ /cricket/i 进行不区分大小写的搜索。

【讨论】:

  • 好的,谢谢..如果我也改变了,即 if($count) 仍然无法正常工作
  • 有什么办法可以通过在它们之间放置/(斜杠)来连接目录名和文件名吗?
  • @user2775241:这就是File::Spec::catfile 应该做的,以独立于操作系统的方式。
猜你喜欢
  • 2016-07-25
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2023-03-06
  • 2020-05-08
  • 2013-03-03
  • 2018-05-17
  • 2011-02-10
相关资源
最近更新 更多