bsd_glob在不同的机器上表现不同

时间:2015-07-14 09:40:05

标签: regex perl

我使用bsd_glob来获取与文件路径的正则表达式匹配的文件列表。对于完全相同的文件集和相同的正则表达式,我的perl实用程序正在RHEL,但不在Suse 11/AIX/Solarix上。我搜索了bsd_glob的任何限制,但无法找到更多信息。有人能指出错误吗?

以下是我要搜索的文件路径的正则表达式:

/datafiles/data_one/level_one/*/DATA*

我需要所有以DATA开头的文件,在“level_one'”下的任何目录中 这适用于我的RHEL框,但不适用于任何其他UnixSuse Linux

以下是我使用bsd_glob

的代码
foreach my $file (bsd_glob ( "$fileName", GLOB_ERR )) {
    if ($fileName =~ /[[:alnum:]]\*\/\*$/) {
        next if -d $file;
        $fileList{$file} = $permissions;
        $total++;
    }   
    elsif ($fileName =~ /[[:alnum:]]\*$/) {
        $fileList{$file} = $permissions;
        $total++;
    }   
    else {
        $fileList{$file} = $permissions;
        $total++;
    }   
}

在我遇到问题的情况下,/datafiles/data_one/level_one/*/DATA*正在传递给bsd_glob。我正在根据我传递给它的正则表达式创建$fileList返回的文件的映射(bsd_glob)。 $permissions是预定义的值。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

这里的问题似乎是你混淆了glob模式和正则表达式。

/[[:alnum:]]\*\/\*$/
/[[:alnum:]]\*$/

您正在查找名为*的文件,该文件位于包含文字*的目录下。

虽然这在技术上是可行的,但它真的很奇怪。并且根本无法永远匹配您glob应找到的模式。

你或许是指:

m,\w+.*/.*$, 

(为清晰起见,不同的分隔符)

另外 - 为什么你专门使用bsd_glob?来自File::Glob

  

从v5.6.0开始,Perl的CORE :: glob()是用bsd_glob()实现的。请注意,它们不共享相同的原型 - CORE :: glob()只接受一个参数。由于历史原因,CORE :: glob()也会将其参数拆分为空格,将其视为多个模式,而bsd_glob()将它们视为一个模式。但请参阅下面的EXPORTS下的bsd_glob。

注释:

  

我使用bsd_glob而不是glob,因为它在不同的UNIX平台上的工作方式略有不同。具体来说,对于上述模式,在某些UNIX平台上,它没有返回具有确切名称“DATA”的文件,只返回带有附加到DATA的文件。

我对此感到有些惊讶,因为他们应该在globbing上实现相同的机制和相同的POSIX标准。有没有机会出现与权限相关的问题?

但是否则你可能会尝试使用glob进行繁重的工作,而只是将文件名与一堆正则表达式进行比较。 (虽然注意 - RE的语法非常不同)

foreach my $file ( glob('/datafiles/data_one/level_one/*/*') ) {
    next unless $filename =~ m,DATA\w+$,;
}