Perl:opendir,readdir,next if,hash

时间:2015-04-01 21:35:24

标签: perl unix hash

我有一个目录$tmp,其中包含名称为.X*-lock的文件以及其他纯文件和目录。

我将$tmp的内容与不应删除的.X*-lock文件名对应的哈希表中的值进行比较。然后,我希望该脚本删除哈希表中不包含的任何.X*-lock个文件。它无法删除普通文件(非"。"文件),目录或.& ..

这里有一些代码:

 my %h = map { $_ => 1 } @locked_ports;
 #open /tmp and find the .X*-lock files that DO NOT match locked_ports (NOT WORKING)

opendir (DIR, $tmp ) or die "Error in opening dir $tmp\n";
    while ( (my $files = readdir(DIR)))
    {
      next if((-f $files) and (-d $files));
      next if exists $h{$files};
      #unlink($files) if !-d $files;
        if (! -d $files){print "$files\n"};
     }
      closedir(DIR);

正如您所看到的,现在我将unlink替换为print,因此我知道正在列出正确的文件。

让我们在我的$tmp目录中说我有以下文件和目录:

./
../
cheese
.X0-lock
.X10-lock
.X11-unix/
.X1-lock
.X2-lock
.X3-lock
.X4-lock
.X5-lock

但哈希表中只有.X1-lock。因此,我想打印/删除所有其他.X*-lock个文件,但不打印.X11-unix/目录,cheese文件或.& ..

使用上面的代码,它不会打印好...,但它会打印cheese.X11-unix。如何更改它以便不打印?

(注意:这是一个词干Perl: foreach line, split, modify the string, set to array. Opendir, next if files=modified string. Unlink files我被告知不要在评论中提出更多问题,所以我提出了一个新问题。)

谢谢!

1 个答案:

答案 0 :(得分:1)

我可能会这样做:

opendir (my $dirhandle, $tmp) or die "Error in opening dir $tmp: $!";
while (my $file = readdir($dirhandle)) {
    # skip directories and files in our hash
    next if -d "$tmp/$file" || $h{$file};
    # skip files that don't look like .X###-lock
    next unless $file =~ /
        \A    # beginning of string
        \.    # a literal '.'
        X     # a literal 'X'
        \d+   # 1 or more numeric digits
        -lock # literal string '-lock'
        \z    # the end of the string
    /x; # 'x' allows free whitespace and comments in regex
#   unlink("$tmp/$file");
    print "$file\n"
}
closedir($dirhandle);

如果您发现它更具可读性,那么最后一个条件可以写成:

next if $file !~ /\A\.X\d+-lock\z/;

甚至:

    if ($file =~ /\A\.X\d+-lock\z/) {
    #   unlink("$tmp/$file");
        print "$file\n"
    }