LINUX.ORG.RU

Поиск файлов perl-пакетов и выполнение действия для каждого из них

 ,


0

2

Собственно, накатал функцию для означенной надобности: например, найти файлы пакетов Digest::MD5, File::Map и выполнить fgrep VERSION на каждом из них:

PerlSrch_Pkg Digest::MD5 File::Map -- fgrep VERSION

Код функции:

PerlSrch_Pkg () {
  local -a lstPkgNames lstPerlINC
  local arg rxPkgNames
  
  [[ $@ ]] || return 1
  while (($#)); do
    arg=$1; shift
    if [[ $arg == '--' ]]; then
      break
    else
      lstPkgNames+=("${arg//::/\/}")
    fi
  done
  rxPkgNames="("$(declare -p lstPkgNames | sed -r -e 's%^.+\[0\]="%[0]="%' -e 's%\s*\[[0-9]+\]="([^"]+)"%\1|%g' -e "s%\)'$%%" -e 's%\|$%%')")"
  
  readarray -t lstPerlINC < <(perl -e 'print join(qq|\n|  => grep { !/^\.$/ and -d $_ } @INC),"\n"')
  
  find "${lstPerlINC[@]}" \
  	-maxdepth 2 \
  	-type f \
  	-regextype posix-extended -regex ".*/${rxPkgNames}\.pm" \
  	$((($#)) && echo "-exec $@ {} ;" || echo '')
}

Пример «утилиты» perlpf (perl-package-finder), использующей оную функцию:

#!/bin/bash

source ${0%/*}/../perl.inc
pkgName=$1; shift
PerlSrch_Pkg $pkgName ${@:+-- $@}

Актуальную версию этой функции и другие полезные маленькие библиотеки для bash можно посмотреть здесь: https://github.com/DRVTiny/bash4-debug-infra

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

У меня примерно то же для пакетов pacman:

% pkggrep perl-tidy EXPORT
/usr/share/perl5/vendor_perl/Perl/Tidy.pm:  @EXPORT
/usr/share/perl5/vendor_perl/Perl/Tidy.pm:@EXPORT = qw( &perltidy );
% ? pkggrep
pkggrep () {
        local P=$1 
        shift
        pacman -Qlq $P | grep --color=auto --color=auto -v /$ | xargs -i grep --color=always -H "$@" {} 2> /dev/null
}

disarmer ★★★
()
Ответ на: комментарий от annulen

Кстати да, в данном случае на Perl было бы и надёжнее: грепать будет по тем файлам пакетов, которые использует *данный* интерпретатор. Например, если есть их несколько в системе.

ТС, запили на Perl и не пердолься с башем, он тут не нужен.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

Реально, перенеси логику в скрипт на perl'е, будет намного аккуратнее

PerlSrch_Pkg () {
  perl-search-pkg.pl $*
}
anonymous
()
Ответ на: комментарий от KennyMinigun

BASH - вполне себе язык написания скриптов, почему вдруг запускалка? Если скорость не критична, а в случае с shell-скриптами это в основном так - можно хоть файлы полностью парсить на BASH, без sed и grep'а, никаких проблем, всё есть.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

BASH - вполне себе язык написания скриптов,

Я и не возражал, мой аргумент следует трактовать как

bash все равно запускает внешние программы. Perl тоже такое умеет, только синтаксис для всего остального удобнее.

можно хоть файлы полностью парсить на BASH

можно, но зачем? ты итак делаешь инструмент для perl и в своем скрипте используешь perl.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 2)

Если тебя убить, то треды с тегом «perl» пропадут из трекера ЛОР'а навсегда

anonymous
()
Ответ на: комментарий от anonymous

Так у нас полно перлеров. Просто они продвинутые и вопросов не задают, а только отвечают. А тупых домохозяек, кончающих от шоу Монти Пайтона - здесь каждая вторая. Поэтому и вопросов от них много. Это как бы не говорит о том, что язык хороший. Это говорит о том, что он популярен. Например, водка тоже популярна. И сигареты популярны, и даже agile со scrum'ом. Времена такие настали печальные, когда вообще любит народ, и далеко не только наш, всякое г*но.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

BASH - вполне себе язык написания скриптов, почему вдруг запускалка? Если скорость не критична

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

shellcheck решает проблему обнаружения ощибок до непросредственного выполнения строчки с кодом, но язык от этого лучше не становится

annulen ★★★★★
()
Ответ на: комментарий от annulen

Проект source mage gnu/linux написал всю обвязку системы на баше, благодаря чему, система бутстрапится на самый минимум компонент, то есть даже не нуждается в perl и python для работы, и при этом, гибка настолько, насколько позволяет баш. А он позволяет дохрена.

Deleted
()
Ответ на: комментарий от annulen

Никогда не понимал этой заботы о феерических ошибках написания: неужели нельзя код перечитать всё-таки прежде, чем запускать.

По моему скромному мнению, самые коварные и действительно важные ошибки - это те, причиной возникновения которых являются недоработки в логике приложения или скрипта. От них не помогает никакая система типов, привязаная анально к сущностям компьютера, а не к бизнес-логике приложения, не помогает от этого и никакой синтаксический анализ: написать синтаксически верную программу, делающую полную хню, может даже... даже другая программа!

Отлично помогает рисование схем на бумаге или доске и обсуждение с коллегами. Сейчас так очень редко это делают - и это действительно плохо, потому что two head is better than one, ну а математика хороша тема, что ум в порядок приводит (и рисование сколь угодно неканонических схем тоже).

Ну и да. синтакис у BASH'а вполне себе синтаксис, уж точно не хуже, чем у Rust'а. Его нужно просто знать - точно так же, как и синтаксис Perl'а. Языки с недоразвитым синтаксисом типа Пайтона выглядят куда хуже.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

В python и rust есть настоящие аргументы у функций (т.е. значение второго аргумента не попадет в первый, если первый оказался «пустым»), и есть стадия компиляции, выявляющая синтаксичекие ошибки до запуска.

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

Бесспорно. Но базовые вещи вроде упомянутых выше + человекопонятный синтаксис (все расширения баша поверх posix sh - тотальное наркоманство) все-таки нужны. Да и какая-то скорость работы иногда тоже не помешает, обилие форков в типичном шелл-скрипте этому не способствует

annulen ★★★★★
()
Ответ на: комментарий от Deleted

А он позволяет дохрена

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

annulen ★★★★★
()
Ответ на: комментарий от annulen

Ты судишь по худшим проявлениям. Я тебе дал пример хорошего, годного хакинга. Попытался. Это как если по коду DRVTiny судить о Perl в целом. Что на форуме нередко проскакивает. Можно, но лучше взять годных перлхакеров, и увидеть как и что они вытворяют с перлом, чтоб понять его мощь и выразительность. То же и с шеллом, взять тот же CRUX и его утилиты.

Deleted
()
Ответ на: комментарий от annulen

Просто не забывай аргументы функций в кавычки совать - и всё будет предсказуемо: пустая строка никуда не денется.

Насчёт наркоманства - я тоже когда-то думал, а потом как-то проникся, поскольку многие конструкции реально лаконичны и удобны.

DRVTiny ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.