Вот решение, которое не полагается на побочный эффект. Чтобы сделать цель интересной, предположим, что вы хотите абстрагироваться от рекурсии (в противном случае решение поля экземпляра вполне допустимо). Хитрость заключается в использовании анонимного класса для получения ссылки «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
}
Почему Вы пытаетесь получить версию модуля? Вам нужно это из программы, Вам просто нужно число для передачи другой операции, или Вы просто пытаетесь узнать то, что Вы имеете?
мне встроили это в 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
переключатель для создания автопакета.
Большинство модулей (особенно от CPAN) имеет переменную $VERSION:
perl -MSome::Module -le 'print $Some::Module::VERSION'
ВЕРСИЯ метод UNIVERSAL всех классов Perl. Можно использовать его для получения версии модуля (если это было установлено, который это обычно имеет).
Вот один лайнер, где только необходимо добавить имя модуля однажды:
perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
Существует меньше вводящий прием, который работает, если Ваш модуль не имеет чего-то безумным как метка времени 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.)
Если Вы будете удачливы, модуль будет иметь переменную пакета названной $VERSION :
$ perl -MCPAN -e 'print "$CPAN::VERSION\n"'
1.9205
Это необходимо для модулей, которые будут распределены на CPAN, но внутренне разработанные модули могли бы следовать различному соглашению или ни одному вообще.
Спасибо за ответы! Я создал функцию в своем .bashrc для легкого нахождения версии модуля Perl:
function perlmodver {
perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1
}
Проверьте pmtools сценарии на CPAN. При использовании Debian (-базирующийся) дистрибутив существует также удобное пакет pmtools . Это включает сценарий "pmvers", который говорит Вам версию модуля. Это довольно удобно.
Это делает что-то подобное различным отправленным людям острот, но это немного более умно об обработке ошибок и может дать Вам версию больше чем одного модуля сразу.
Я записал маленький сценарий, чтобы сообщить что: 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
Кроме того, для модулей, которые используют 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 ...