【问题标题】:How to find the class-file on case insensitive filesystem?如何在不区分大小写的文件系统上找到类文件?
【发布时间】:2023-04-09 19:40:02
【问题描述】:

简单的测试用例(用于演示问题):

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 的文件名。不至于破旧……还有更简单的方法吗?

【问题讨论】:

  • "if (-e "string"); 中的 '-e' 部分是什么?
  • @wald : -e: 检查文件是否存在...perldoc -f -X
  • readdir 有什么问题(如果你想要递归的话,File::Find)?
  • @ThisSuitIsBlackNot 没有任何问题 - 只是不太好。 IS 是否可以解决,但希望有一些更优雅、更短、更快、更好(选择一些)的解决方案.. ;)(或已经准备好/完成的 cpan 模块)。
  • metacpan.org/pod/Path::Iterator::Rule 有一个不错的 API。值得一试。

标签: perl


【解决方案1】:

我目前的解决方案是:

#!/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

所以 - 它正在工作,只是不喜欢它.. ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 2020-03-09
    • 2020-01-16
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多