我使用bsd_glob
来获取与文件路径的正则表达式匹配的文件列表。对于完全相同的文件集和相同的正则表达式,我的perl实用程序正在RHEL
,但不在Suse 11/AIX/Solarix
上。我搜索了bsd_glob
的任何限制,但无法找到更多信息。有人能指出错误吗?
以下是我要搜索的文件路径的正则表达式:
/datafiles/data_one/level_one/*/DATA*
我需要所有以DATA开头的文件,在“level_one'”下的任何目录中
这适用于我的RHEL
框,但不适用于任何其他Unix
和Suse 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
是预定义的值。
感谢任何帮助。
答案 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+$,;
}