Wednesday, September 14, 2011

Как найти путь к Perl-модулю по имени

Одно из основных преимуществ Perl перед тем же Python - наличие 100500 качественных модулей на CPAN, готовых к включению в любой проект.

Естественно, иногда бывает необходимо посмотреть код модуля. А для этого потребуется путь к нему в файловой системе. Рассмотрим несколько подходов к этой проблеме.

  • %INC, @INC

  • Самый простой способ - спросить у Perl :) Пути к модулям, подгруженным с помощью do, require и use можно найти в хэше %INC. Ключами хэша являются имена модулей, преобразованные в относительный путь, а значениями соответственно полные пути к модулям. Например, чтобы вывести путь к модулю Encode можно использовать следующий one-liner:
    $ perl -E 'use Encode; say $INC{"Encode.pm"}'


    Если модуль по каким-то причинам не компилируется, в %INC он не заносится. Поэтому, более универсальным решением будет использовать @INC, проверяя наличие модуля в каждой папке. Для удобства можно написать функцию bash:
    get_path() {
    path="${1//:://}.pm"
    location=""
    for dir in $(perl -e 'print "@INC"'); do
    if [ -r "$dir/$path" ]; then
    location="$dir/$path"
    break
    fi
    done
    echo $location
    }

  • perldoc


  • Во многих случаях для нахождения пути к модулю или бинарнику можно использовать perldoc -l Modname или perldoc -lm Modname

    • perldoc -l ищет не только в @INC, но и в $PATH. Если в файле нет POD-документации, путь не выводится.


    • perldoc -lm ищет только в @INC, но выводит путь даже если в файле нет POD-документации.



  • module_info

  • Также можно использовать тулзу module_info, которая идет с модулем Module::Info:

    $ module_info CGI::FormBuilder

    Name: CGI::FormBuilder
    Version: 3.0501
    Directory: /usr/local/lib/perl5/site_perl/5.14.1
    File: /usr/local/lib/perl5/site_perl/5.14.1/CGI/FormBuilder.pm
    Core module: no

No comments:

Post a Comment