Поиск

Функция system()

Простейший способ запустить команду операционной системы из Pert — воспользоваться функцией system(). Эта функция приостанавливает текущую программу на Perl, выполняет внешнюю программу, после чего возобновляет выполнение программы на Perl. Синтаксис функции system() выглядит так:

Здесь вместо параметра команда нужно указать имя программы, которую необходимо выполнить. Если внешняя программа завершилась успешно, функция system() возвращает код 0. Если же в процессе выполнения внешней программы произошло что-либо непредвиденное, возвращается ненулевой код возврата. Обратите внимание, что эти значения согласуются с точностью "до наоборот" со значениями true и false, принятыми в Perl.

А теперь рассмотрим пример функции system() для UNIX.

А вот как будет выглядеть тот же самый пример для системы Windows:

Как видите, функция system() работает одинаково в обеих системах. Однако не стоит забывать, что рассматриваемые нами операционные системы имеют совершенно разный набор команд. Так, для получения содержимого каталога в системе DOS используется команда dir, а в UNIX — Is. В то же время команда perldoc не зависит от типа операционной системы и работает совершенно одинаково как в DOS, так и в UNIX. Но такое случается довольно редко.

После запуска внешней программы с помощью функции system() все ее сообщения выводятся на терминал, так же, как и сообщения программы на Perl. Если же для продолжения вычислений внешней программе понадобятся исходные данные, их можно будет ввести с терминала точно так же, как и данные для программына Perl. При запуске внешней программы она наследует стандартные потоки ввода и вывода STDIN и STDOUT вызвавшей ее программы на Perl. Таким образом, операции ввода/вывода для внешней программы будут выполняться над теми же источниками данных. Таким образом, с помощью функции system() можно без проблем вызывать внешние интерактивные программы.

Рассмотрим пример для системы UNIX.

Для систем Windows и DOS этот пример будет выглядеть так:

В каждом из представленных фрагментов выполняется запуск текстового редактора для внесения изменений в файл myfile.txt. Для системы UNIX таким редактором является vi, а для DOS — edit. Текстовый редактор будет выполняться в полноэкранном режиме и, естественно, все его внутренние клавиатурные команды будут работать как обычно. По завершении работы с редактором управление возвращается программе на Perl.

Функцию system() можно использовать для запуска любых программ, а не только консольных приложений (которые работают в текстовом режиме) операционной системы. Например, в системе UNIX для запуска приложения, отображающего часы в графическом режиме, используется следующий оператор Perl:

Чтобы запустить редактор Notepad в Windows, воспользуйтесь следующим оператором Perl:

Использование средств командной оболочки

Функция system(), как и большинство других функций, рассмотренных на данном занятии, позволяет воспользоваться всеми преимуществами командной оболочки операционной системы, в которой вы работаете. Так происходит потому, что перед вызовом внешней программы функция system() запускает копию командной оболочки (в UNIX это /bin/sh, а в Windows и DOS — command,com), которая и выполняет эту программу. Как следствие, при вызове внешней команды вы можете перенаправлять потоки ввода/вывода (>), выполнять конвейерную обработку (|), запускать задания в фоновом режиме в системе UNIX (&), а также пользоваться любыми доступными средствами оболочки.

Например, чтобы запустить внешнюю программу и перенаправить ее вывод в файл, используется следующий оператор Perl:

Эта функция передает системной оболочке команду perldoc perlfaqS и перенаправляет стандартный выходной поток в файл faqfile.txt. Заметьте, что синтаксис данного оператора одинаков как для UNIX, так и для DOS.

Как и следовало ожидать, некоторые возможности, такие как перевод задачи в фоновый режим, использование регулярных выражений и др., работают только в системе UNIX, поскольку в командной оболочке DOS и Windows они не поддерживаются. Вот пример:

В последнем примере после запуска программы xterm управление будет сразу же передано программе на Perl, поскольку символ амперсанда (fi), расположенный после имени команды, предписывает оболочке запустить программу xterm в фоновом режиме. При этом интерпретатор Perl не будет ожидать завершения ее работы.

В системе UNIX для запуска внешних программ с помощью функции systemf}, выполнения конвейерной обработки и подстановок команд (об этом речь пойдет чуть ниже) интерпретатор Perl использует оболочку /bin/sh или ее аналог. Причем этот процесс не зависит от типа оболочки, в которой работает пользователь. Так сделано для того, чтобы обеспечить максимальную переносимость программ на разные платформы UNIX.

Некоторые из рассмотренных в данной главе примеров с использованием функции system() не будут работать на компьютерах Macintosh. Особенно это относится к подстановкам команд и конвейерной обработке. За дополнительной информацией обратитесь к разделу Macintosh Specific Features справочной системы MacPerl.