Ключи и значения %INC зависимого платформы или нет?

Я хотел бы получить полное имя файла включенного модуля. Рассмотрите этот код:

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 содержит записи для каждого имени файла, включенного через do, require, или useоператоры. Ключ является именем файла, которое Вы указали (с именами модуля, преобразованными в пути), и значение является местоположением найденного файла.

Эти ключи зависимы от платформы или нет? Если я использую File::Spec или что? По крайней мере, ActivePerl на использовании win32 / вместо \.

Обновление: что относительно %INC значения? Действительно ли они зависимы от платформы?

6
задан codeholic 20 March 2010 в 06:23
поделиться

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;
}
2
ответ дан 17 December 2019 в 18:15
поделиться

Вот достаточно надежная реализация, которая также будет работать для модулей, которые еще не были загружены.

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;
1
ответ дан 17 December 2019 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: