Ключи и значения% INC зависят от платформы или нет? - PullRequest
6 голосов
/ 23 февраля 2010

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

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 значений? Они зависят от платформы?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

Учитывая, что это стандартный модуль, используйте подход 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;
}
1 голос
/ 27 февраля 2010

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

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;
...