Perl: когда вы используете system () и когда устанавливаете пакет? - PullRequest
2 голосов
/ 28 декабря 2010

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

Альтернатива, которая выбирается много раз, - это просто вызвать system() (или обратная нотация `` внутри Perl) и использовать вывод команды оболочки, которая делает то, что вы хотите. Конечно, это не всегда возможно, и когда оно используется, обычно есть обертка вокруг вызова команды, но обычно это проще.

Мой вопрос: когда, по вашему опыту, компромисс тянет в любую сторону?

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

Ответы [ 5 ]

7 голосов
/ 28 декабря 2010

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

2 голосов
/ 05 января 2011

Основная проблема заключается в сложности и продолжительности установки модулей Perl. Я бы выяснил, почему у них проблемы с установкой пакетов, и попытался бы упростить их процесс.

Распространенным решением является изменение вашего процесса. Администраторы обычно не любят устанавливать прямо из CPAN, но в качестве разработчика вы можете использовать локальное хранилище CPAN. Вы «замораживаете» используемые вами пакеты, а затем продвигаете их для использования в производстве.

Это говорит о компромиссе между использованием модулей или его распределением следующим образом:

Данные

Модули, как правило, возвращают структурированные данные, а шелл-аут возвращает неструктурированный текст, который вам нужно проанализировать.

Производительность / использование ресурсов

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

Дополнительные зависимости

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

2 голосов
/ 28 декабря 2010

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

Вы можете установить модули прямо в вашем домашнем каталоге и, когда придет время, договориться с системными администраторами: http://perl.jonallen.info/writing/articles/install-perl-modules-without-root

2 голосов
/ 28 декабря 2010

Модули, всегда модули.И когда я говорю всегда, я имею в виду «почти всегда».

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

1 голос
/ 28 декабря 2010

Как сказано выше, всегда модули, потому что ls не dir ...

...