Каковы различия между системой и обратными окнами и трубами в Perl?
Perl поддерживает три способа (которые я знаю) запуска внешних программ:
system
:
system PROGRAM LIST
как в:
system "abc";
backticks как в:
`abc`;
выполняется через трубу, как в:
open ABC, "abc|";
Каковы различия между ними? Вот что я знаю:
- Вы можете использовать backticks и pipe, чтобы легко получить вывод команды.
- что он (больше в будущих изменениях?)
Ответы
Ответ 1
- system(): запускает команду и возвращает команду статус выхода
- backticks: запускает команду и возвращает команду вывод
- pipe: запускает команду и позволяет использовать их как дескриптор
Также backticks перенаправляет исполняемую программу STDOUT на переменную, и система отправляет ее в вашу основную программу STDOUT.
Ответ 2
Документация perlipc объясняет различные способы взаимодействия с другими процессами с Perl и открытая документация perlfunc объясняет файловые дескрипторы файлов.
- Система отправляет свой вывод на стандартный вывод (и ошибку)
- Backticks фиксирует стандартный вывод и возвращает его (но не стандартную ошибку)
- Открытые каналы позволяют захватывать вывод и читать его из дескриптора файла или печатать в дескрипторе файла и использовать его как вход для внешней команды.
Существуют также модули, которые обрабатывают эти детали с кросс-платформенными крайними случаями.
Ответ 3
Система также возвращает значение выхода приложения (ERRORLEVEL в Windows).
Трубы немного сложнее в использовании, так как чтение из них и их закрытие добавляет дополнительный код.
Наконец, они имеют различную реализацию, которая должна была делать разные вещи. Используя каналы, вы можете общаться с исполняемыми приложениями, в то время как другие команды не позволяют это (легко).
Ответ 4
Получение статуса выхода программы не ограничивается system()
. Когда вы вызываете close(PIPE)
, он возвращает статус выхода, и вы можете получить последний статус выхода для всех 3 методов из $?
.
Также обратите внимание, что
readpipe('...')
совпадает с
`...`