2009-04-28 3 views
26

Perl поддерживает три пути (что я знаю) запущенных внешних программ:В чем разница между системой и backticks и трубами в Perl?

system:

system PROGRAM LIST 

как в:

system "abc"; 

кавычку как в:

`abc`; 

работает через трубу, как в:

open ABC, "abc|"; 

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

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

ответ

35
  • система(): выполняет команду и возвращает статус выхода командования
  • кавычку: запускает команду и возвращает вывод команды
  • трубы: запускает команду и позволяет использовать в качестве ручки

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

+0

Трубы - более мелкозернистый контроль обратных выступов. backticks возвращают STDOUT, как в: $ date = 'date'. С трубами вы можете решить, когда и как читать выход, или отправить сигналы процессу. –

2

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

1

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

Пожалуйста, обратите внимание, что

readpipe('...') 

такая же, как

`...` 
+0

Вы могли бы выполнить это предложение? Также обратите внимание, что readpipe ('...') вместо .... –

+0

Я исправил форматирование, чтобы сделать его более четким. Использование обратных циклов для обозначения фиксированного типа затрудняет выбор типа * real * backticks ... – ephemient

+0

В качестве дальнейшего примечания, '...' и qx /.../ (и qx (...) и qx # ... # и любые другие разделители) также эквивалентны. – ephemient

3

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

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

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

Смежные вопросы