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)
Ответ на: комментарий от KennyMinigun

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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