2016-12-14 3 views
2

Предисловие: Я знаю, как загрузить определенную версию модуля. Это не то, что мне нужно.В Perl, как я могу определить версию модуля для определенного модуля, который уже загружен?

Я пишу сценарий для получения некоторых текстовых/простых данных, отформатированных как JSON с внутреннего сервера в моей компании. Я использую LWP для извлечения данных.

У меня есть весь скрипт, но у меня есть одна проблема.

Я пишу это на RHEL5, который использует Perl 5.8.8 с LWP 5.805. В соответствии с приведенной ниже страницей, если я хочу напрямую выводить содержание ответа на файл, я должен использовать :content_file => filename

ОДНАКО, отмечено следующее.

Обратите внимание, что это «: content_file» опция не поддерживается в старых версиях LWP, поэтому следует рассмотреть вопрос о добавлении использования LWP 5.66; чтобы проверить версию LWP, если вы считаете, что ваша программа может работать в системах с более старыми версиями .

Если вы должны быть совместимы с более старыми версиями LWP, а затем использовать этот синтаксис, который делает то же самое:

use HTTP::Request::Common; $response = $ua->request(GET($url), $filespec);

Поскольку это RHEL 5, я должен использовать старшее LWP, но я хочу сделать свой сценарий так, чтобы он использовал этот новый стиль вместо старого стиля, когда он запускается на RHEL 6 и выше, в котором используется более новая версия LWP, которая поддерживает :content_file.

Следовательно, мне нужно знать, как определить версию модуля, и что более важно, мне нужно знать, что это самая ранняя LWP версия для поддержки :content_file

+0

Почему вы не делаете, как предлагает комментарий, и просто используйте 'use HTTP :: Request :: Common; $ response = $ ua-> request (GET ($ url), $ filespec); '(независимо от версии)? – ikegami

+0

Это только со старыми версиями. Я не думаю, что новые версии поддерживают это. – Speeddymon

+0

Дальнейшее чтение комментариев указывает на то, что более новые версии AEW обратная совместимость. – Speeddymon

ответ

6

номер версии LWP::UserAgent в переменном пакете $LWP::UserAgent::VERSION, или вы можете использовать $LWP::VERSION, если вы написали use LWP, чтобы загрузить модуль

Однако нет причин использовать разные методы для разных версий модуля; отсталая-совместимая альтернатива

my $response = $ua->request(GET($url), $filespec) 

будет отлично работать на любой версии

+0

Не знал, что более новые версии совместимы с обратной совместимостью. Будут давать ему шанс на RHEL 6 и 7 завтра.И если это сработает, я отмечу это как ответ. – Speeddymon

+0

Я смог подтвердить это сегодня на RHEL6. Спасибо за проницательный ответ. – Speeddymon

+0

Кстати, вы также процитировали это решение в своем вопросе. xD –

6

Поскольку все объекты простираются от UNIVERSAL, вы можете сделать просто $ua->VERSION получить версию.

Похоже, :content_file было добавлено в 5.66. Сравните документацию между 5.65 и 5.66.

+0

Да, это правильный способ получить версию произвольного модуля. (Соглашение предназначено для модулей, имеющих переменную пакета '$ VERSION', и это то, что фактически проверяет метод UNIVERSAL VERSION, но в случае, если модуль переопределяет метод класса VERSION, вызов метода класса дает достоверный ответ.) – ysth

+1

@ysth , Это желаемое за действительное, так как индексор CPAN захватывает версию из '$ VERSION', а не' -> VERSION'. – ikegami

+0

@ikegami - это версия дистрибутива, а не версия модуля – ysth

Смежные вопросы