Язык программирования Perl



              

Выполнение внешних программ


В Perl имеется операция выполнения программы, которая обозначается обратными апострофами (backticks) или синонимом - конструкцией qx(), упоминавшейся в лекции 7. Она предназначена для получения результатов выполнения внешней программы. Эта операция пытается выполнить любую внешнюю программу, ожидает окончания ее работы и возвращает то, что программа выводит в свой поток стандартного вывода. Например, так в операционных системах Linux или MS Windows можно выполнить команду dir, выводящую список файлов в текущем каталоге:

my $file_list = `dir`; # в скалярном контексте my @file_list = qx(dir); # в списочном контексте

В зависимости от того, в каком контексте - скалярном или списочном - употребляется операция выполнения программы, результат работы внешней программы рассматривается как одна строка или как список строк.

Выполнить внешнюю программу можно также с помощью функции system, которая организует синхронный запуск программы и возвращает код завершения. Код завершения 0 означает, что команда была выполнена успешно. Приведем пример ее использования в программе, архивирующей файлы с суффиксом .pl в текущем каталоге:

use English; # использовать длинные имена спец. переменных

# в ОС MS Windows архивируем файлы с помощью pkzip if ($OSNAME =~ m/win/i) { system "pkzip", "-a", "pearls.zip", "*.pl"; # в ОС GNU/Linux архивируем файлы с помощью tar и gzip } elsif ($OSNAME =~ m/linux/i) { system "tar -cv *.pl | gzip > pearls.tar.gz"; }

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

{ # временно помещаем каталог с программой в пути поиска local $ENV{"PATH"} = $path_to_the_program; # каталог system($program_to_execute); # вызов программы } # значение $ENV{"PATH"} будет восстановлено




Содержание  Назад  Вперед