0

这是在 Windows 上 - 我如何在 perl 中将所有不以“.zip”结尾的文件都包含在内?

这是当前代码,就这个问题而言,它是不可更改的——所有可以更改的只是 $pattern 变量的值。

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

顺便问一下,这段代码中 map 函数的目的是什么?它有效,但我不明白。

4

2 回答 2

5

这里的使用map表明一个人可能有多种模式可供glob选择。例如

my @arr = map { glob( $_ ) } ($pattern1, $pattern2);

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

如果您坚持提到的行,或者如果您使用readdir,则可以过滤掉结果,

use File::Basename;
@arr = grep { ! (fileparse $_, '.zip')[2] } @arr;

为了更加严格,您可能希望过滤掉实际上是 zip 文件的文件,而不仅仅是名称以 结尾的文件.zip

use File::MimeInfo::Magic;
@arr = grep { mimetype($_) ne 'application/zip' } @arr;
于 2012-10-24T16:51:58.483 回答
3

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

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

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

print "$_\n" for @nonZipFiles;
于 2012-10-24T16:13:06.040 回答