这是在 Windows 上 - 我如何在 perl 中将所有不以“.zip”结尾的文件都包含在内?
这是当前代码,就这个问题而言,它是不可更改的——所有可以更改的只是 $pattern 变量的值。
my @arr = map { glob( $_ ) } $pattern;
顺便问一下,这段代码中 map 函数的目的是什么?它有效,但我不明白。
这是在 Windows 上 - 我如何在 perl 中将所有不以“.zip”结尾的文件都包含在内?
这是当前代码,就这个问题而言,它是不可更改的——所有可以更改的只是 $pattern 变量的值。
my @arr = map { glob( $_ ) } $pattern;
顺便问一下,这段代码中 map 函数的目的是什么?它有效,但我不明白。
这里的使用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;
根据glob,它更像是通配符匹配,而不是真正的正则表达式匹配。反正我从来都不喜欢 glob(结果在同一个脚本中是不可重复的,就像 glob 在循环中一样)。
我知道你说过你不能改变那个 glob 行(所以这可能是不可能的),但是这段代码做了你想做的事情,虽然使用了不同的代码:
opendir(DIR, ".") or die $!;
my @nonZipFiles = grep(!/^\.+|\.zip$/, readdir(DIR));
closedir(DIR);
print "$_\n" for @nonZipFiles;