Почему я не должен использовать инструменты оболочки в коде Perl? - PullRequest
4 голосов
/ 25 июля 2009

Обычно не рекомендуется использовать дополнительные инструменты linux в коде Perl;Например, если кто-то намеревается напечатать последнюю строку текстового файла, он может:

$last_line = `tail -1 $file` ;

или другим способом, открыть файл и прочитать его построчно

 open(INFO,$file);
 while(<INFO>) {
   $last_line = $_ if eof;
   }

Какие подводные камнииспользования предыдущего и почему я должен избегать использования инструментов оболочки в моем коде?

thanx,

Ответы [ 6 ]

24 голосов
/ 25 июля 2009
  • Эффективность - вам не нужно создавать новый процесс
  • Переносимость - вам не нужно беспокоиться о том, что исполняемый файл не существует, принимает различные ключи или имеет другой вывод
  • Простота использования - вам не нужно анализировать выходные данные, результаты уже находятся в пригодной для использования форме
  • Обработка ошибок - вы имеете более детальный контроль над ошибками и тем, что с ними делать в Perl.
15 голосов
/ 25 июля 2009

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

Например, в первом случае, если $file содержит "afilename ; rm -rf ~ "вы были бы очень несчастным туристом.

PS Лучшим для Perlway хвостом является использование File :: ReadBackwards

10 голосов
/ 25 июля 2009

Одна из основных причин (помимо переносимости) неисполнения команд оболочки заключается в том, что он создает накладные расходы, порождая другой процесс. Вот почему большая часть таких же функций доступна через CPAN в модулях Perl.

9 голосов
/ 25 июля 2009

Одна из причин заключается в том, что ваш Perl-код может быть запущен в среде, где нет инструмента оболочки, называемого 'tail'.

Это персональный вызов в зависимости от проекта:

  • Будет ли он всегда использоваться в оболочках с tail?
  • Вы заботитесь только об использовании чистого кода Perl?
5 голосов
/ 26 июля 2009

Используя tail? Хорошо. Но это действительно особый случай, поскольку он так прост в использовании и так тривиален.

Проблема, как правило, заключается не в эффективности или переносимости, что в значительной степени не имеет значения;проблема в простоте использования. Чтобы запустить внешнюю утилиту, вы должны выяснить, какие аргументы она принимает, написать код для преобразования структур данных вашей программы в этот формат, правильно заключить их в кавычки, построить командную строку и запустить приложение. Затем вам может потребоваться передать им данные и прочитать данные из них (включая сложность, такую ​​как цикл обработки событий, беспокойство о взаимоблокировке и т. Д.), И, наконец, интерпретировать возвращаемое значение. (Процессы UNIX считают «0» истинным, а все остальное ложным, но Perl допускает обратное. foo() and die трудно читать.) Это большая работа, и поэтому люди ее избегают. Гораздо проще создать экземпляр класса и вызвать для него методы для получения необходимых данных.

(Вы можете абстрагировать процессы таким способом; см., Например, Crypt :: GpgME. Он обрабатывает сложность, связанную с этим. с вызовом gpg, что обычно включает создание нескольких файловых дескрипторов, отличных от STDOUT, STDIN и STDERR, среди прочего.)

4 голосов
/ 26 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...