Как я могу найти версию установленного модуля Perl?

Вот решение, которое не полагается на побочный эффект. Чтобы сделать цель интересной, предположим, что вы хотите абстрагироваться от рекурсии (в противном случае решение поля экземпляра вполне допустимо). Хитрость заключается в использовании анонимного класса для получения ссылки «this»:

public static IntToLongFunction reduce(int zeroCase, LongBinaryOperator reduce) {
  return new Object() {
    IntToLongFunction f = x -> x == 0
                               ? zeroCase
                               : reduce.applyAsLong(x, this.f.applyAsLong(x - 1));
  }.f;
}

public static void main(String[] args) {
  IntToLongFunction fact = reduce(1, (a, b) -> a * b);
  IntToLongFunction sum = reduce(0, (a, b) -> a + b);
  System.out.println(fact.applyAsLong(5)); // 120
  System.out.println(sum.applyAsLong(5)); // 15
}
56
задан Drew Stephens 19 July 2009 в 16:26
поделиться

9 ответов

Почему Вы пытаетесь получить версию модуля? Вам нужно это из программы, Вам просто нужно число для передачи другой операции, или Вы просто пытаетесь узнать то, что Вы имеете?

мне встроили это в cpan (который идет с жемчугом) с эти -D переключатель, таким образом, Вы видите версию, которую Вы установили и текущая версия на CPAN:

$ cpan -D Text::CSV_XS

Text::CSV_XS
-------------------------------------------------------------------------
        Fast 8bit clean version of Text::CSV
        H/HM/HMBRAND/Text-CSV_XS-0.54.tgz
        /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm
        Installed: 0.32
        CPAN:      0.54  Not up to date
        H.Merijn Brand (HMBRAND)
        h.m.brand@xs4all.nl

, Если Вы хотите видеть все устаревшие модули, используйте -O (капитал O) переключатель:

$ cpan -O
Module Name                                Local    CPAN
-------------------------------------------------------------------------
Apache::DB                                0.1300  0.1400
Apache::SOAP                              0.0000  0.7100
Apache::Session                           1.8300  1.8700
Apache::SizeLimit                         0.0300  0.9100
Apache::XMLRPC::Lite                      0.0000  0.7100
... and so on

, Если Вы хотите видеть это для всех модулей, Вы установили, попробуйте эти -a переключатель для создания автопакета.

60
ответ дан brian d foy 26 November 2019 в 17:01
поделиться

Большинство модулей (особенно от CPAN) имеет переменную $VERSION:

perl -MSome::Module -le 'print $Some::Module::VERSION'
57
ответ дан zigdon 26 November 2019 в 17:01
поделиться

ВЕРСИЯ метод UNIVERSAL всех классов Perl. Можно использовать его для получения версии модуля (если это было установлено, который это обычно имеет).

Вот один лайнер, где только необходимо добавить имя модуля однажды:

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
33
ответ дан jmcnamara 26 November 2019 в 17:01
поделиться

Существует меньше вводящий прием, который работает, если Ваш модуль не имеет чего-то безумным как метка времени Unix как номер версии.

perl -MFoo::Bar\ 9999

Это работает, потому что то, во что это переводит,

use Foo::Bar 9999;

т.е. версия Foo:: Панель это - по крайней мере, версия 9999 или более новый. И то, что Вы получаете,

Foo::Bar version 9999 required--this is only version 1.1.
BEGIN failed--compilation aborted.

(Аккуратный прием, который я изучил от Matt Trout.)

21
ответ дан Penfold 26 November 2019 в 17:01
поделиться

Если Вы будете удачливы, модуль будет иметь переменную пакета названной $VERSION :

$ perl -MCPAN -e 'print "$CPAN::VERSION\n"'
1.9205

Это необходимо для модулей, которые будут распределены на CPAN, но внутренне разработанные модули могли бы следовать различному соглашению или ни одному вообще.

8
ответ дан Jon Ericson 26 November 2019 в 17:01
поделиться

Спасибо за ответы! Я создал функцию в своем .bashrc для легкого нахождения версии модуля Perl:

function perlmodver {
    perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1
} 
6
ответ дан Drew Stephens 26 November 2019 в 17:01
поделиться

Проверьте pmtools сценарии на CPAN. При использовании Debian (-базирующийся) дистрибутив существует также удобное пакет pmtools . Это включает сценарий "pmvers", который говорит Вам версию модуля. Это довольно удобно.

Это делает что-то подобное различным отправленным людям острот, но это немного более умно об обработке ошибок и может дать Вам версию больше чем одного модуля сразу.

3
ответ дан Onlyjob 26 November 2019 в 17:01
поделиться

Я записал маленький сценарий, чтобы сообщить что: perlver.

Это - простой небольшой инструмент, который говорит Вам, какую версию модуля Вы установили, и где .pm файл расположен. Это также гарантирует, что модуль может быть загружен успешно. Это автоматически преобразовывает †˜-’, †˜/’, или †˜\’ к †˜:: ’, таким образом, можно использовать путь или имя распределения вместо канонического имени модуля.

Это предполагает, что модуль определяет $VERSION. Если модуль не определит $VERSION, он все еще скажет Вам, где .pm файл, таким образом, можно исследовать его вручную. Можно также проверить несколько модулей сразу:

$ perlver CPAN DBD-Pg Getopt::Long
CPAN 1.7602 is
 /usr/lib/perl5/5.8.8/CPAN.pm
DBD::Pg 1.49 is
 /usr/lib/perl5/vendor_perl/5.8.8/i686-linux/DBD/Pg.pm
Getopt::Long 2.36 is
 /usr/lib/perl5/vendor_perl/5.8.8/Getopt/Long.pm
2
ответ дан cjm 26 November 2019 в 17:01
поделиться

Кроме того, для модулей, которые используют Exporter.pm, можно получить эту информацию с этим приемом:

perl -MSome::Module=99999 -ex
Some::Module version 99999 required--this is only version 1.9205 at ...

Для модулей, которые не используют Exporter.pm, немного более длинный прием сообщает ту же информацию:

perl -e'use Some::Module 99999'
Some::Module version 99999 required--this is only version 1.9205 at ...
1
ответ дан tye 26 November 2019 в 17:01
поделиться
Другие вопросы по тегам:

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