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+$,;
}