我有一个文件列表和一个数组,其中包含一些包含文件名模式的值
filename: awefsad-name1-x33
@array=("name1","name2","name3");
如何删除包含数组名称的文件?
@files = ("*");
foreach $check(@files){
foreach $i(@array){
if($check =~ /\Q$i/){
unlink $check;
}
}
}
答案 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//
将模式预编译为正则表达式。使用好名称可以更容易地阅读您的代码,strict
和warnings
会告诉您有关错误和错误的信息。
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