Несколько человек уже упоминали, что вы должны использовать обратные пометки, когда:
- Вам нужно захватить (или подавить) вывод.
- Не существует встроенной функции или модуля Perl для выполнения той же задачи, или у вас есть веская причина не использовать модуль или встроенный модуль.
- Вы дезинфицируете свой ввод.
- Вы проверяете возвращаемое значение.
К сожалению, такие вещи, как правильная проверка возвращаемого значения , могут быть довольно сложными. Он умер до сигнала? Дождался ли он до конца, но вернул ли смешной статус выхода? Стандартные способы интерпретации $?
просто ужасны.
Я бы рекомендовал использовать IPC :: System :: Simple модуля capture()
и system()
функций, а не обратные пометки. Функция capture()
работает так же, как обратные метки, за исключением того, что:
- Предоставляет подробную диагностику, если команда не запускается, прерывается сигналом или возвращает неожиданное значение выхода.
- Предоставляет подробную диагностику, если переданы испорченные данные.
- Предоставляет простой механизм задания допустимых значений выхода.
- Позволяет вызывать обратные пометки без оболочки, если вы хотите.
- Он предоставляет надежные механизмы для избежания оболочки, даже если вы используете один аргумент.
Команды также работают согласованно в операционных системах и версиях Perl, в отличие от встроенного в Perl system()
, который может не проверять испорченные данные при вызове с несколькими аргументами в старых версиях Perl (например, 5.6.0 с несколькими аргументами) или который может вызвать оболочку в любом случае под Windows.
Например, следующий фрагмент кода сохранит результаты вызова perldoc
в скаляр, исключит оболочку и выдает исключение, если страница не может быть найдена (поскольку perldoc возвращает 1).
#!/usr/bin/perl -w
use strict;
use IPC::System::Simple qw(capture);
# Make sure we're called with command-line arguments.
@ARGV or die "Usage: $0 arguments\n";
my $documentation = capture('perldoc', @ARGV);
IPC :: System :: Simple - это чистый Perl, работает на 5.6.0 и выше и не имеет никаких зависимостей, которые обычно не поставляются с вашим дистрибутивом Perl. (В Windows это зависит от модуля Win32 ::, который поставляется с ActiveState и Strawberry Perl).
Отказ от ответственности: я являюсь автором IPC :: System :: Simple , поэтому я могу показать некоторую предвзятость.