Глава 14: Управление процессами.
14.2 Использование обратных кавычек
Еще один способ запуска процесса — заключить командную строку для /bin/sh в обратные кавычки. Как и в shell, этот механизм запускает команду и ожидает ее завершення, получая данные со стандартного вывода по мере их поступления:
$now = "the time is now".'date'; # получает текст и дату
Значение переменной $now теперь представляет собой текст the time is now и результат выполнения команды date(l) (включая конечний символ новой строки):
the time is now Fri Aug 13 23:59:59 PDT 1996
Если взятая в обратные кавычки команда используется не в скалярном, а в списочном контексте, то возвращается список строкових значений, каждое из которых представляет собой строку (оканчивающуюся символом новой строки*) из результата выполнения команды. В примере с командой date у нас был бы всего один элемент, потому что она выдала всего одну строку текста. Результат работы команды who выглядит так:
merlyn tty42 Dec 7 19:41
fred ttylA Aug 31 07:02
barney ttylF Sep 1 09:22
Вот как можно получить этот результат в списочном контексте:
foreach $_ ('who') ( # один раз для каждой строки текста из who
<$who,$where,$when) = /(\S+)\s+(\S+)\s+(.*)/;
print "$who on $where at $when\n";
}
* Или символом, которьш у вас занесен в переменную $/.
При каждом выполнении этого цикла используется одна строка выходных данных команды who, потому что взятая в обратные кавички команда интерпретируется в списочном контексте.
Стандартный ввод и стандартный вывод ошибок команды, взятой в обратные кавички, наследуются от Perl-процесса*. Это значит, что обычно стандартный вывод таких команд ви можете получить как значение строки, заключенной в обратные кавички. Одна из распространенных операций — обьединение стандартного вывода ошибок со стандартним выводом, чтобы команда в обратннх кавычках "подбирала" их оба. Для этого используется конструкция shell 2>&1:
die "rm spoke!" if 'rm fred 2>&1';
Здесь Perl-процесс завершается, если rm посылает какое-нибудь сообщение — либо на стандартный вывод, либо на стандартный вывод ошибок, потому что результат больше не будет пустой строкой (пустая строка соответствовала би значенню "ложь").
* На самом деле все не так просто. См. соответствующий ответ в разделе 8 сборника часто задаваемых вопросов по Perl ("Как перехватить stderr из внешней команды?"). Если у вас Perl версии 5.004, этот сборник распространяется как обычная man-страница — в данном случае perlfaq8( 1).
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|