Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Изучаем Perl - Шварц Р.

Шварц Р., Кристиансен Т. Изучаем Perl — Москва, 2002. — 324 c.
Скачать (прямая ссылка): izuchaemperl2002.djvu
Предыдущая << 1 .. 68 69 70 71 72 73 < 74 > 75 76 77 78 79 80 .. 124 >> Следующая

следующие две команды эквивалентны:
system "grep 'fred flintstone' buffaloes"; # с использованием shell
system "grep","fred flintstone","buffaloes"; # без использования shell
14. Управление процессами
Применение в функции system списка, а не одной строки, экономит также
один процесс shell, поэтому поступайте так при любой возможности. (Если
форма функции system с одним аргументом достаточно проста, Perl сам
оптимизирует код, полностью убирая вызов shell и обращаясь к
соответствующей программе непосредственно, как если бы вы использовали
вызов функции с несколькими аргументами.)
Вот еще один пример эквивалентных форм:
@cfiles = ("fred.с","barney.с"); # что компилировать
^options = ("-DHARD","-DGRANITE"); # опции
system "сс -о slate 0options 0cfiles"; # с shell
system "сс","-о","slate",0options,0cflies"; # без shell
Использование обратных кавычек
Еще один способ запуска процесса - заключить командную строку для /bin/sh
в обратные кавычки. Как и в shell, этот механизм запускает команду и
ожидает ее завершения, получая данные со стандартного вывода по мере их
поступления:
Snow = "the time is now".'date'; # получает текст и дату
Значение переменной $now теперь представляет собой текст the time is now
и результат выполнения команды date{ 1) (включая конечный символ новой
строки):
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";
}
Или символом, который у вас занесен в переменную $ /
1 ос
Инцчпо.м рсг/
При каждом выполнении этого цикла используется одна строка выходных
данных команды who, потому что взятая в обратные кавычки команда
интерпретируется в списочном контексте.
Стандартный ввод и стандартный вывод ошибок команды, взятой в обратные
кавычки, наследуются от Perl-процесса*. Это значит, что обычно
стандартный вывод таких команд вы можете получить как значение строки,
заключенной в обратные кавычки. Одна из распространенных операций -
объединение стандартного вывода ошибок со стандартным выводом, чтобы
команда в обратных кавычках "подбирала" их оба. Для этого используется
конструкция shell 2>&l:
die "rm spoke'" if rm fred 2>&1 ;
Здесь Perl-процесс завершается, если rm посылает какое-нибудь сообщение -
либо на стандартный вывод, либо на стандартный вывод ошибок, потому что
результат больше не будет пустой строкой (пустая строка соответствовала
бы значению "ложь").
Использование процессов как дескрипторов файлов
Следующий способ запуска процесса - создание процесса, который выглядит
как дескриптор файла (аналогично библиотечной подпрограмме рореп{3), если
вы с ней знакомы). Мы можем создать для процесса дескриптор файла,
который либо получает результат работы процесса, либо подает в него
входные данные**. Ниже приведен пример создания дескриптора файла для
процесса who( 1). Поскольку этот процесс выдает результат, который мы
хотим прочитать, мы создаем дескриптор файла, открытый для чтения:
open(WHOPROC, "who Iм); # открыть who для чтения
t
Обратите внимание на вертикальную черту справа от who. Эта черта
информирует Perl о том, что данная операция open относится не к имени
файла, а к команде, которую необходимо запустить. Поскольку черта стоит
справа от команды, данный дескриптор файла открывается для чтения. Это
означает, что предполагается прием данных со стандартного вывода команды
who. (Стандартный ввод и стандартный вывод ошибок продолжают
использоваться совместно с Perl-процессом.) Для остальной части программы
дескриптор WHOPROC - это просто дескриптор файла, который открыт для
* На самом деле все не так просто См соответствующий ответ в разделе 8
сборника часто задаваемых вопросов по Perl ("Как перехватить stderr из
внешней команды;") Если у вас Pei 1 версии 5 004, этот сборник
распространяется как обычная man-страница - в данном случае per!faq8( 1)
** Но не одновременно Примеры двунаправленной связи приведены в главе 6
книги Programming Perl и на man-странице perhpc( 1)
14. Управление процессами
187
чтения, что означает возможность выполнения над файлом всех обычных
операций ввода-вывода. Вот как можно прочитать данные из команды who в
массив:
Qwhosaid = <WHOPROC>;
Аналогичным образом для запуска команды, которой необходимы входные
данные, мы можем открыть дескриптор файла процесса для записи, поставив
Предыдущая << 1 .. 68 69 70 71 72 73 < 74 > 75 76 77 78 79 80 .. 124 >> Следующая