【问题标题】:Perl Glob everything that doesn't end with zipPerl Glob 所有不以 zip 结尾的东西
【发布时间】:2012-10-24 15:23:29
【问题描述】:

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

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

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

顺便问一句,这段代码中 map 函数的目的是什么?可以,但我不明白。

【问题讨论】:

  • “它有效”是什么意思?
  • map { glob ( $_ ) } $pattern 等价于glob $pattern
  • choroba - “works” - 该语句将文件列表返回到数组,给定一个模式,正如预期的那样。那么地图有什么意义吗?我会写成“@arr = glob $pattern;”

标签: perl pattern-matching glob


【解决方案1】:

这里使用map 表明glob 可能有多种模式。例如

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

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

如果你被提到的那一行卡住了,或者如果你使用readdir,那么你可能会过滤掉结果,

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

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

use File::MimeInfo::Magic;
@arr = grep { mimetype($_) ne 'application/zip' } @arr;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 您确定/[^\.zip]$/ 是您要查找的正则表达式吗?毕竟,[] 表示一个字符类!此外,在字符类中,. 并不特殊,不需要转义。 ((?!\.zip)$ 可能会更好……或者grep {not $_=~/\.zip$/} ...
    • 我想你的意思是grep ! /\.zip$/, readdir(DIR)不要像那样使用map - 这是一个运算符而不是for 循环。 print "$_\n" for @nonZipFiles 很好。
    • +1 表示readdir,-1 表示错误的正则表达式。我发布了一些替代过滤器,但没有包含正则表达式,希望你能修复你的
    • 对不起,我的正则表达式很弱。我快速启动它,它工作,但可能是出于错误的原因。我将在上面进行编辑,并确保它删除“点”文件名,尤其是。 “。”和“..”。
    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多