6

含まれているモジュールの完全なファイル名を取得したいと思います。次のコードを検討してください。

package MyTest;

my $path = join '/', split /::/, __PACKAGE__;
$path .= ".pm";

print "$INC{$path}\n";

1;

$ perl -Ipath/to/module -MMyTest -e0
path/to/module/MyTest.pm

すべてのプラットフォームで動作しますか?

perlvar

ハッシュには、、、または演算子によって含まれる各ファイル名のエントリ が含ま%INCれます。キーは指定したファイル名 (モジュール名はパス名に変換されます) で、値は見つかったファイルの場所です。dorequireuse

これらのキーはプラットフォームに依存しますか? 私は何を使うべきFile::Specですか?少なくとも win32 の ActivePerl は/の代わりに使用し\ます。

更新:%INC値についてはどうですか? それらはプラットフォームに依存していますか?

4

2 に答える 2

2

これが標準モジュールであることを考えると、Module::Loadedからのアプローチに進みます。

sub is_loaded (*) { 
    my $pm      = shift;
    my $file    = __PACKAGE__->_pm_to_file( $pm ) or return;

    return $INC{$file} if exists $INC{$file};

    return;
}

sub _pm_to_file {
    my $pkg = shift;
    my $pm  = shift or return;

    my $file = join '/', split '::', $pm;
    $file .= '.pm';

    return $file;
}
于 2010-02-23T15:03:06.723 に答える
1

これは、まだロードされていないモジュールでも機能する、かなり堅牢な実装です。

use File::Find;
use File::Spec;

sub pkg2path (*) {
    my $file = join '[\\\/:]' =>
               map  "\Q$_"    =>
               split /::|'/   => "$_[0].pm";            # '

    /$file$/ and return File::Spec->rel2abs( $INC{$_} )
        for keys %INC;

    # omit the rest to only find loaded modules

    my $path; find {
        no_chdir => 1,
        wanted   => sub {
            $path = $_ and goto found if /$file$/
        }
    } => @INC;

    found: File::Spec->rel2abs($path or return)
}

say pkg2path Benchmark;
say pkg2path Devel::Trace;
于 2010-02-26T21:36:45.603 に答える