Как распечатать отфильтрованный список вывода внешней команды в Perl?

Я изучаю Перл. В качестве упражнения я пытаюсь распечатать все установленные модули Mojolicious. Я использую Strawberry Perl и не устанавливаю grep.

Моя наивная попытка:

perl -wE "for (sort `cpan -l`) { chomp; say if index($_, 'Mojo') == 0; };"

Я узнал, что cpan -l возвращает список. Я ожидал строки, но ничего. Я sort возвращаю список, chomp каждую запись и say те, которые начинаются с "Mojo".

Это скорее работает, но печатает каждую строку дважды:

Mojolicious::Sessions   undef
Mojolicious::Sessions   undef
Mojolicious::Static     undef
Mojolicious::Static     undef
Mojolicious::Types      undef
Mojolicious::Types      undef
Mojolicious::Validator  undef
Mojolicious::Validator  undef
Mojolicious::Validator::Validation      undef
Mojolicious::Validator::Validation      undef

Что плохого в том, что каждую запись печатает дважды?

Изменить:

Я запускаю код под Cent OS. Похоже, он работает нормально, но установлены две версии библиотек.

perl -we 'for (sort `cpan -l`) { chomp; print $_, "\n" if index($_, "JSON") == 0; };'

JSON::PP        4.02
JSON::PP        4.04
JSON::PP::Boolean       4.02
JSON::PP::Boolean       4.04

Редактировать 2:

По рекомендации @zdim я проверил пути к файлам установленных модулей. Оказалось, что есть двойные установки:

whichpm -a Mojolicious
C:\Strawberry\perl\site\lib\Mojolicious.pm
C:\Strawberry\perl\vendor\lib\Mojolicious.pm


whichpm -v Mojolicious
whichpm: WARNING: DUPLICATE module files found for 'Mojolicious':
  C:\Strawberry\perl\vendor\lib\Mojolicious.pm
Mojolicious     8.22    (non-core)      C:\Strawberry\perl\site\lib\Mojolicious.pm

Похоже вопрос был неверным.

Возможной причиной дублирования установки может быть неправильное обновление модулей. После установки Strawbery я использовал следующую команду:

cpan-outdated -p | cpanm

Спасибо, ребята, за помощь. Похоже, это был неправильный вопрос. Я принимаю данный ответ и открою новый «лучший» вопрос.


person Miroslav Popov    schedule 05.08.2019    source источник
comment
У вас установлен Perl grep: perl -e "print sort grep/^Mojo/,qx(cpan -l)"   -  person mob    schedule 06.08.2019
comment
@моб, ты прав. Я имел в виду команду grep в консоли.   -  person Miroslav Popov    schedule 06.08.2019
comment
Похоже, проблема в том, что установлено две версии каждого модуля. cpan -l по какой-то причине показать строку выворота как undef.   -  person Miroslav Popov    schedule 06.08.2019
comment
Распечатайте точные местоположения файлов для каждого, чтобы увидеть, что это за удвоение?   -  person zdim    schedule 06.08.2019


Ответы (1)


Не уверен, что делает cpan, и его справочная страница растягивается для меня. Может быть, это список модулей из двух версий Perl? Или действительно установлены две версии модулей?

Вот еще один вариант с ядром ExtUtils::Installed.

perl -MExtUtils::Installed -MList::Util=max -wE'
    $obj = ExtUtils::Installed->new; 
    @mods = sort $obj->modules; 
    $max_len = max map { length } @mods; 
    printf("%-${max_len}s -- %s\n", $_, $obj->version($_)) for @mods'

Это печатает все из них. Чтобы увидеть только те, которые начинаются с Mojo, измените последнюю строку на

/^Mojo/ and printf("%-${max_len}s -- %s\n", $_, $obj->version($_)) for @mods'

/^Mojo/ — это регулярное выражение, которое проверяет $_ (по умолчанию) на предмет того, начинается ли оно с (^ привязки) литеральной строки Mojo. Я думаю, что это понятнее, чем использование index, и является идиоматичным (более понятным).

Но printf имеет в качестве ширины поля длину самого длинного имени модуля, найденного до фильтрации , что, вероятно, слишком велико для отфильтрованного списка. Таким образом, для более качественного вывода вы можете сначала отфильтровать с помощью grep

my @mods_filtered = sort grep { /^Mojo/ } $obj->modules; 
my $max_len = max map { length } @mods_filtered; 
printf("%-${max_len}s -- %s\n", $_, $obj->version($_)) for @mods_filtered;

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

См. документацию для получения подробной информации о том, что делает этот модуль.

Также см. эту публикацию с кодом для другого варианта — прямого поиска файлов.

person zdim    schedule 05.08.2019
comment
@MiroslavPopov Да, регулярное выражение полезно; может быть действительно чистым и легким для написания. (И он также может быть чрезмерно сложным и мощным.) Тем не менее, старый добрый index кажется недооцененным в Perl, хотя на самом деле обычно есть другие, более простые для кодирования способы в таком богатом языке. Но я не удивлюсь, если то, что вы сделали, было намного быстрее, чем запуск механизма регулярных выражений (но я этого не знаю, это должно быть проверено). Это, конечно, имело бы значение только в том случае, если бы было сделано много, но такие проверки часто бывают. - person zdim; 06.08.2019
comment
Найдены дубликаты установок. Проверено через whichpm: C:\Users\info\OneDrive\Documents>whichpm -a Mojolicious C:\Strawberry\perl\site\lib\Mojolicious.pm C:\Strawberry\perl\vendor\lib\Mojolicious.pm C:\Users\info\OneDrive\Documents>whichpm -v Mojolicious whichpm: WARNING: DUPLICATE module files found for 'Mojolicious': C:\Strawberry\perl\vendor\lib\Mojolicious.pm Mojolicious 8.22 (non-core) C:\Strawberry\perl\site\lib\Mojolicious.pm - person Miroslav Popov; 06.08.2019
comment
можно поменять вопрос на как быть с установкой дублированных модулей? Разрешено ли это в SO? - person Miroslav Popov; 06.08.2019
comment
@MiroslavPopov (Короткий ответ: ваш вопрос, и вы можете изменить его так, как вам нравится; однако на самом деле не рекомендуется менять его, его содержание. Как только люди увидят его, и особенно один раз есть ответы, затем они запекаются.Редактирование великолепно - вы обновили его осмысленно и не изменили вопрос.) Обычно люди видят вещи по-другому после размышлений над ними и просмотра комментариев и ответов; это часть процесса, позволяющая лучше формулировать наши вопросы. Нормальные вещи, и то же самое с SO - и тогда вы задаете другой вопрос. - person zdim; 06.08.2019
comment
@MiroslavPopov Найдены повторяющиеся установки --- отлично! И хорошо, что вы посмотрели, потому что это кажется неправильным, и хорошо, что вы задали (новый вопрос) об этом. Я думаю, это также представляет общий интерес, так как я подозреваю, что это происходит часто. - person zdim; 06.08.2019