简单的测试用例(用于演示问题):
mkdir -p ./lib1/Class ./lib2/Class
touch ./lib1/Class/Name.pm ./lib2/Class/NAME.pm
所以,请:
./lib1/Class/Name.pm
./lib2/Class/NAME.pm
需要在不区分大小写的文件系统(OS X的HFS +)中搜索正确的文件。
以下适用于区分大小写的文件系统
#!/usr/bin/env perl
use 5.014;
use strict;
use warnings;
my @DIRS = qw(./lib1 ./lib2);
for my $class ( qw(Class::Name Class::NAME) ) {
my $file = findClassFile($class);
say $file;
}
sub findClassFile {
my($file) = @_;
$file =~ s|::|/|g;
$file .= ".pm";
for my $dir (@DIRS) {
return "$dir/$file" if( -e "$dir/$file" );
}
return undef;
}
并打印
./lib1/Class/Name.pm
./lib2/Class/NAME.pm
OS X上的打印错误:
./lib1/Class/Name.pm
./lib1/Class/NAME.pm
如何在OSX的不敏感文件系统上找到正确的文件名?
Ps:现在我只想到opendir/readdir/chdir
编写和递归例程,并检查文件名来自readdir
的内容。不要破旧......存在一些更简单的方法吗?
答案 0 :(得分:0)
我目前的解决方案是:
#!/usr/bin/env perl
use 5.014;
use strict;
use warnings;
my @DIRS = qw(./lib1 ./lib2 /Users/me/tmp/lib3);
for my $class ( qw(Class::Name Class::NAME CLASS::name Class::Namex) ) {
my $file = findClassFile($class);
say $file // "Not found $class";
}
sub findClassFile {
my($classname) = @_;
my $file = ($classname =~ s|::|/|gr) . ".pm";
for my $dir (@DIRS) {
return "$dir/$file" if( FileExists("$dir/$file") );
}
return undef;
}
sub FileExists {
my($path) = @_;
my $curr = $path =~ m|^/| ? "/" : ".";
for my $part (split '/', $path) {
next unless $part;
opendir(my $dfd, $curr) || return undef;
my @files = grep {/^$part$/} readdir($dfd);
closedir($dfd);
return undef unless( @files );
$curr .= "/$part";
}
return $curr;
}
什么打印:
./lib1/Class/Name.pm
./lib2/Class/NAME.pm
/Users/me/tmp/lib3/CLASS/name.pm
Not found Class::Namex
所以 - 它正在工作,只是不喜欢它。;)