Анимация
JavaScript
|
Главная Библионтека функция system () Простейший способ запустить команду операционной системы из Pert - воспользоваться функцией system;}. Эта функция приостанавливает текущую программу на Perl, выполняет внешнюю программу, после чего возобновляет выполнение программы на Perl. Синтаксис функции system{) выглядит так: system команда; Здесь вместо параметра команда нужно указать имя программы, которую необходимо выполнить. Если внешняя программа завершилась успешно, функция systeiti() возвращает код 0. Если же в процессе выполнения внешней программы произошло что-либо непредвиденное, возвращается ненулевой код возврата. Обратите внимание, что эти значения согласуются с точностью "до наоборот" со значениями true и false, принятыми в Perl. А теперь рассмотрим пример функции system() для UNIX. system("ls -IF"); # аЕесзи сцЕнисе кагагсга \ Шхе=ешдвл дзФВпещю ш «кщ» sysban if { system( "perldoc -f system") ) { EEcint "Дз0(!1впаир(га к Iferl ш установлена !\n"; А вот как будет выглядеть тот же самый пример для системы Windows: systeiii( "dir /w"); I Вывести содержимое каталога I Распечатаем документацию на функщло system if ( system ("perldoc -f system") ) { print "Документация к Perl не установлена!\n"; Как видите, функция system!) работает одинаково в обеих системах. Однако не стоит забывать, что рассматриваемые нами операционные системы имеют совершенно разный набор команд. Так, для получения содержимого каталога в системе DOS используется команда dir, а в UNIX - Is. В то же время команда perldoc не зависит от типа операционной системы и работает совершенно одинаково как в DOS, так и в UNIX. Но такое случается довольно редко. После запуска внешней программы с помощью функции system() все ее сообщения выводятся на терминал, так же, как и сообщения программы на Perl. Если же для продолжения вычислений внешней программе понадобятся исходные данные, их можно будет ввести с терминала точно так же, как и данные для программы на Perl. При запуске внешней программы она наследует стандартные потоки ввода и вывода SION и STDOUT вызвавшей ее программы на Perl. Таким образом, операции ввода/вывода для внешней программы будут выполняться над теми же источниками данных. Таким образом, с помощью функции system!) можно без проблем вызывать внешние интерактивные программы. Рассмотрим пример для системы UNIX. $file="myfiletxt"; system{"vi Sfile"); Для систем Windows и DOS этот пример будет выглядеть так: Sfile="myfile.txf; svstem("edit $file"); В каждом из представленных фрагментов выполняется запуск текстового редактора для внесения изменений в файл myfile.txt. Для системы UNIX таким редактором является vi, а для DOS - edit. Текстовый редактор будет выполняться в полноэкранном режиме и, естественно, все его внутренние клавиатурные команды будут работать как обычно. По завершении работы с редактором управление возвращается программе на Perl. Функдию systemO можно использовать для запуска любых программ, а не только консольных приложений (которые работают в текстовом режиме) операционной системы. Например, в системе UNIX для запуска приложения, отображающего часы в графическом режиме, используется следующий оператор Perl: Bystem( "xclock -update 1") ; Чтобы запустить редактор Notepad в Windows, воспользуйтесь следующим оператором Perl: system ("notepad, exefile.txt"); Использование средств командной оболочки Функции ет(), как и большинство других функций, рассмотренных на данном занятии, позволяет воспользоваться всеми преимуществами командной оболочки операционной системы, в которой вы работаете. Так происходит потому, что перед вызовом внешней программы функция system() запускает копию командной оболочки (в UNIX это /bin/sh, а в Windows и DOS - command.com), которая и выполняет эту программу. Как следствие, при вызове внешней команды вы можете перенаправлять потоки ввода/вывода (>), выполнять конвейерную обработку (), запускать задания в фоновом режиме в системе UNIX (&), а также пользоваться любыми доступными средствами оболочки. Например, чтобы запустить внешнюю программу и перенаправить ее вывод в файл, используется следующий оператор Perl: system{ "perldoc perlfaqS > faqfile.t") ; Эта функция передает системной оболочке команду perldoc perlfaqS и перенаправляет стандартный выходной поток в файл faqfile.txt. Заметьте, что синтаксис данного оператора одинаков как для UNIX, так и для DOS. Как и следовало ожидать, некоторые возможности, такие как перевод задачи в фоновый режим, использование регулярных выражений и др., работают только в системе UNIX, поскольку в командной оболочке DOS и Windows они не поддерживаются. Вот пример: t Отссрт1уем файл, имя котсрого зада в пере $f, i я распечатаем результат syBtem{"sort $f ); t В некоторых системах для ча • исальзуется команда 1рг I Запустим щхэграмму Xterm в фзЕювса»! реяжпуе systanCxtenn Ь"); В последнем примере после запуска программы управление будет сразу же передано программе на Perl, поскольку символ амперсанда (ь), расположенный после имени команды, предписывает оболочке запустить программу xterm в фоновом режиме. При этом интерпретатор не будет ожидать завершения ее работы. В системе UNIX для запуска внешних программ с помощью функции ет(}, выполнения конвейерной обработки и подстановок команд (об этом речь пойдет чуть ниже) интерпретатор Perl использует оболочку /bin/sh или ее аналог. Причем этот процесс не зависит от типа оболочки, в которой работает пользователь. Так сделано для того, чтобы обеспечить максимальную переносимость программ на разные платформы UN. Некоторые из рассмотренных в данной главе примеров с использованием функции system!) не будут работать на компьютерах Macintosh. Особенно это относится к подстановкам команд и конвейерной обработке. За дополнительной информацией обратитесь к разделу Macintosh Specific Features справочной системы MacPerl. Перенаправление вхходного потока Несмотря на все преимущества, у функции есть также один существенный недостаток. Она не позволяет перенаправить выходной поток программы на дальнейшую обработку интерпретатору Perl. Чтобы устранить описанный недостаток, можно воспользоваться обходным маневром, как показано ниже на примере. I Учтите, что команд Mir Is используются здесь # только для примера! В больппшсгве случаев намного эффективнее t булуг работать функции opendir/readdir/closedir systeiB("dir > outfile"); # В UNIX вместо "dir" иснользуйте комавду Is open(OF, "outfile"} die "Ошибка при открьпии файла outfile: $1"; edata=<OF>; close{OF); В этом примере выходные данные команды dir (или перенаправляются командной оболочкой в файл outfile. Затем этот файл открывается и его содержимое помещается в массив Таким образом, в этом массиве будут содержаться данные, полученные от команды dir. Описанный метод слишком громоздкий и не вполне очевидный. Поэтому нет ничего удивительного в том, что в Perl предусмотрено более элегантное решение - использование оператора подстановки команд, или обратных кавычек. Любая команда в Perl, заключенная в обратные кавычки ( ), рассматривается как внешняя программа и запускается на выполнение по аналогии с функцией system(). При этом выходной поток внешней программы перехватывается и возвращается в вызывающую программу так же, как это происходит при вызове функций, например: Sdirectory=-dir-; ♦ 8 UNIX вместе ir используйте команду Is В этом примере данные, полученные в результате выполнения команды dir, помещаются в переменную $directory Как и в функции внутри обратных кавычек можно пользоваться всеми доступными средствами командной оболочки: символ > вызывает перенаправление вгходного потока, символ выполняет конвейерную обработку и (в системе UNIX) символ s позволяет запустить программу в фоновом режиме. Только не забудьте, что при перенаправлении выходного потока программы или ее запуске в фоновом режиме в программу на Perl не возвращаются никакие данные. В скалярном контексте оператор подстановки команд возвращает выходные данные программы в виде текстовой строки. Если в данных содержится несколько строк текста, они разделяются в строке специальным символом - разделителем за- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [ 52 ] 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |