Perl Glob所有不以zip结尾的东西

时间:2012-10-24 15:23:30

标签: perl pattern-matching glob

这是在Windows上 - 我如何在perl中为所有不以“.zip”结尾的文件进行全局处理?

这是当前代码,并且出于此问题的目的,不可更改 - 所有可以更改的是$ pattern变量的值。

my @arr = map { glob( $_ ) } $pattern;

作为一个问题,这段代码中map函数的用途是什么?它有效,但我不明白。

2 个答案:

答案 0 :(得分:5)

此处map的使用表明,glob可能有多种模式。my @arr = map { glob( $_ ) } ($pattern1, $pattern2); 例如

@arr

将列出所有匹配任一模式的文件(可能重复)。请注意,您也可以使用内置的readdir填充数组readdir

如果您坚持使用上述行,或者使用use File::Basename; @arr = grep { ! (fileparse $_, '.zip')[2] } @arr; ,则可以过滤掉结果,

.zip

为了更加严谨,您可能希望过滤掉实际上是压缩文件的文件,而不仅仅是名称以use File::MimeInfo::Magic; @arr = grep { mimetype($_) ne 'application/zip' } @arr; 结尾的文件:

{{1}}

答案 1 :(得分:3)

根据glob,它更像是通配符匹配,而不是真正的正则表达式匹配。我从来没有喜欢过glob(结果在同一个脚本中是不可重复的,就像glob在循环中一样)。

我知道你说你不能改变那个glob线(所以这可能不可能),但是这段代码做了你想做的事情,但是使用了不同的代码:

opendir(DIR, ".") or die $!;
my @nonZipFiles = grep(!/^\.+|\.zip$/, readdir(DIR));
closedir(DIR);

print "$_\n" for @nonZipFiles;