如何删除与Perl模式列表匹配的所有文件?

时间:2014-02-23 12:29:22

标签: regex arrays perl file

我有一个文件列表和一个数组,其中包含一些包含文件名模式的值

filename: awefsad-name1-x33

@array=("name1","name2","name3");

如何删除包含数组名称的文件?

@files = ("*");
foreach $check(@files){
   foreach $i(@array){
      if($check =~ /\Q$i/){
          unlink $check;
      }
   }
}

2 个答案:

答案 0 :(得分:2)

将正则表达式连接到单个表达式会产生这个单个for循环以取消链接文件。

my $match_re = join '|', map {"\Q$_"} ("name1","name2","name3");

for my $file (grep {/$match_re/} <*>) {
    print "unlink $file\n";
}

答案 1 :(得分:1)

您需要使用glob built-in来获取文件名列表。您还可以使用qr//将模式预编译为正则表达式。使用好名称可以更容易地阅读您的代码,strictwarnings会告诉您有关错误和错误的信息。

use strict;
use warnings;
use feature 'say'; # just for demonstration
my @patterns = map { qr/\Q$_/ } ( "name1", "name2", "name3" );

FILE: foreach my $file ( glob '*' ) {
  foreach my $pattern (@patterns) {
    if ($file =~ $pattern) {
      say $file or warn qq{cannot delete $file: $!}; # replace with unlink
      next FILE;
    }
  }
}

编辑:请注意,您只能删除每个文件一次,因此我们在匹配一个文件并删除文件后立即完成模式列表。

我将unlink更改为say,以便您查看匹配的内容。对我来说它有效:

my @patterns = map { qr/\Q$_/ } ( 'scratch', '.txt' );

__END__
data.txt
file2.txt
scratch.pl
scratch2.pl