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

Regex bsd_glob在不同的机器上表现不同,regex,perl,Regex,Perl,我正在使用bsd_glob获取与文件路径的正则表达式匹配的文件列表。我的perl实用程序使用的是RHEL,而不是Suse 11/AIX/Solarix,用于完全相同的文件集和相同的正则表达式。我在谷歌上搜索了bsd_glob的任何限制,但找不到太多信息。有人能指出哪里出了问题吗 下面是我正在搜索的文件路径的正则表达式: /datafiles/data_one/level_one/*/DATA* 我需要所有以数据开头的文件,位于“level_one”下的任何目录中。 这在我的RHEL框上非常有效

我正在使用
bsd_glob
获取与文件路径的正则表达式匹配的文件列表。我的perl实用程序使用的是
RHEL
,而不是
Suse 11/AIX/Solarix
,用于完全相同的文件集和相同的正则表达式。我在谷歌上搜索了bsd_glob的任何限制,但找不到太多信息。有人能指出哪里出了问题吗

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

/datafiles/data_one/level_one/*/DATA*
我需要所有以数据开头的文件,位于“level_one”下的任何目录中。
这在我的
RHEL
框上非常有效,但在任何其他
Unix
Suse-Linux
上都不起作用

下面是我使用的
bsd\u 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\u one/level\u one/*/data*
正在传递给
bsd\u glob
。我正在创建文件的映射(
$fileList
),这些文件由
bsd_glob
根据传递给它的正则表达式返回<代码>$permissions是预定义的值


非常感谢您的帮助。

这里的问题似乎是您混淆了全局模式和正则表达式

/[[:alnum:]]\*\/\*$/
/[[:alnum:]]\*$/
您正在查找一个名为
*
的文件,该文件位于包含文本
*
的目录下

虽然这在技术上是可能的,但真的很奇怪。而且根本无法匹配您的
glob
应该找到的模式

你的意思可能是:

m,\w+.*/.*$, 
(为清晰起见,使用不同的分隔符)

另外-您为什么专门使用
bsd\u glob
?发件人:

自v5.6.0以来,Perl的核心::glob()是根据bsd_glob()实现的。请注意,它们并不共享同一个原型——CORE::glob()只接受一个参数。由于历史原因,CORE::glob()也会将其关于空格的参数拆分,将其视为多个模式,而bsd_glob()将其视为一个模式。但请参见以下“出口”项下的bsd_glob

评论:

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

我对此有点惊讶,因为他们应该在globbing上实现相同的机制和相同的POSIX标准。是否存在与权限相关的问题

但是,除此之外,您可以尝试不使用
glob
来完成繁重的工作,而只是将文件名与一组正则表达式进行比较。(尽管note-REs有非常不同的语法)


这不是正则表达式。至少,我希望不是这样!“星号”之前的部分是固定的,我需要匹配该固定部分之后的任何内容,以及包含数据的其他内容*向我们展示一个完整(但简短)的工作代码示例,演示该问题。为什么在这里专门使用
bsd_glob
?它看起来并没有做任何超出“标准”的事情?还有,
$filename
设置为什么?您指定的模式?我使用了
bsd_glob
而不是
glob
,因为它在不同UNIX平台上的工作方式略有不同。具体来说,对于上述模式,在某些UNIX平台上,它不会返回具有确切名称“DATA”的文件,而只返回附加了数据的文件。我主要关心的是,该程序在一个平台上对完全相同的输入集正确工作,而在另一个平台上则不正确。两个系统上使用的perl版本是相同的。您设置的
bsd\u glob
标志将导致它在遇到错误时退出。这有可能发生吗?我也看不出你的3个匹配中有多少价值-正则表达式看起来不起作用,所以你只运行最后一个代码块。嗯,这很奇怪,因为那个文档表明,它们首先都使用相同的机制来进行全局搜索。
foreach my $file ( glob('/datafiles/data_one/level_one/*/*') ) {
    next unless $filename =~ m,DATA\w+$,;
}