Каковы различия между системой и backticks и трубы в Perl? - PullRequest
27 голосов
/ 28 апреля 2009

Perl поддерживает три известных мне способа запуска внешних программ:

system * * 1004

   system PROGRAM LIST

как в:

system "abc";

backticks как в:

`abc`;

пропустить его через трубу, как в:

open ABC, "abc|";

В чем различия между ними? Вот что я знаю:

  1. Вы можете использовать обратные пометки и каналы, чтобы легко получить выходные данные команды.
  2. вот и все (больше в будущих изменениях?)

Ответы [ 4 ]

36 голосов
/ 28 апреля 2009
  • system (): запускает команду и возвращает команды выхода из состояния
  • backticks: запускает команду и возвращает команды * output
  • pipe: запускает команду и позволяет использовать их как дескриптор

Также backticks перенаправляет STDOUT исполняемой программы в переменную, и система отправляет его в STDOUT вашей основной программы.

3 голосов
/ 28 апреля 2009

Документация perlipc объясняет различные способы взаимодействия с другими процессами из Perl, а открытая документация perlfunc объясняет конвейерные файловые дескрипторы.

  • Система отправляет свой вывод на стандартный вывод (и ошибку)
  • Обратные метки фиксируют стандартный вывод и возвращают его (но не стандартную ошибку)
  • Открытие по каналу позволяет вам захватить вывод и прочитать его из дескриптора файла или распечатать в дескриптор файла и использовать его в качестве ввода для внешней команды.

Существуют также модули, которые обрабатывают эти детали с кроссплатформенными краями.

2 голосов
/ 28 апреля 2009

Система также возвращает значение выхода из приложения (ERRORLEVEL в Windows). Каналы немного сложнее в использовании, так как чтение из них и их закрытие добавляет дополнительный код. Наконец, они имеют различную реализацию, которая должна была делать разные вещи. Используя каналы, вы можете общаться с выполненными приложениями, в то время как другие команды не позволяют это (легко).

1 голос
/ 28 апреля 2009

Получение статуса выхода из программы не ограничено system(). Когда вы вызываете close(PIPE), он возвращает статус выхода, и вы можете получить последний статус выхода для всех 3 методов из $?.

Обратите внимание, что

readpipe('...')

совпадает с

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