Анимация
JavaScript


Главная  Библионтека 

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

писей. В контексте списка выходные данные программы построчно присваиваются переменным списка. При этом в конце каждой строки помещается разделитель записей. Вот пример:

edir=~dir-; f В LtUX всто dir исгьзу ка Is foreach (Шг) {

# Оабота кавдз! сярски в отдепыгхли }

Здесь в цикле foreach обрабатывается каждая строка, находящаяся в массиве idir.

В Perl существует альтернативная форма записи оператора подстановки команд. Вместо обратных кавычек можно использовать оператор qx{>. Команду, которую нужно выполнить, следует поместить в фигурные скобки, как показано ниже:

$perldoc=qx{perldoc perl};

Оператор qx позволяет повысить читабельность программы, если при записи внешней команды внутрь обратных кавычек следует поместить служебные символы, такие как прямые и обратные кавычки, косую черту и др. (Напомним, что перед служебными символами следует поставить обратную косую черту.) Вот пример.

Выглядит не очень понятно

А теперь перепишем этот оператор так: $complex=qx{ sorrep -1 •con-};# Намного яснее

Вместо фигурных скобок можно использовать произвольные символы, а также любые парные символы, такие как о, () и [ ].

Как избежать обращения к командной оболочке

в некоторых случаях бывает трудно определить границы области действия интерпретатора Perl и командной оболочки. Давайте рассмотрим два примера. Для UNIX:

?myh0Bie= *1б $НОНЕ;

Или то же самое для DOS и Windows: $myhome= dir twindir*";

Как определить, к чему в первом примере относится переменная МЕ? Является ли она неременной Perl, или неременной окружения командной оболочки? А во втором примере? Является ли конструкция %windir% неременной окружения командного интерпретатора coimand.com, или это хэш языка Perl, за которым помещен знак процента?

Хуже всего то, что переменная ОМЕ интерпретируется Perl. А это означает, что она является скаляром Perl, а не неременной окружения командной оболочки, как вы, вероятно, предполагали. Таким образом, внутри обратных кавычек переменные заменяются их значениями, точно так же, как это происходит и внутри двойных кавычек (" ") • Однако данное правило не относится к хэшу - только к массивам и скалярам. Таким образом, во втором примере конструкция %windir% относится к неременной окружения командного интерпретатора conmand.com.



Чтобы избежать интерпретации переменных внутри обратных кавычек, поместите перед ними символ обратной косой черты, как показано в следующем примере:

$иуЬоте=ЧБ \5H0HE~; i Символ "У прикртвает переменную !Н13УЕ

А вот пример для DOS и Windows:

$windows=dir lwindir%~;

В этих примерах используется значение переменной окружения в UNIX и

windir в DOS

При использовании альтернативной формы записи оператора подстановки команд в конструкции qx{} следует замените фаничитель, как показано в следующем примере:

$myhome=qx 1в $ЕОНЕ ;

Или для Windows и DOS: $vindows=qx dir 4windir% ;

Конструкция qx распознается интерпретатором Perl и обрабатывается особым образом: внутри одинарных кавычек не выполняется замена переменных на их значение. Таким образом, в операторе подстановки команд появляется возможность использовать

любые служебные символы, не помещая перед ними символ обратной косой.

Конвейерная обработка

Конвейерная обработка используется в системах UNIX и для пере-

дачи данных между процессами. Она позволяет связать выходной поток одного процесса с входным потоком другого. Давайте рассмотрим следующий набор команд DOS, который с небольшими изменениями (команлу dir нужно заменить на Is) будет

работать и в UNIX:

dir > outfile

sort outfile > newfile re nile

Здесь выходные данные команды dir перенаправляются в файл outfile. Затем содержимое этого файла сортируется с помощью команды sort и записывается в новый файл newfile. И, наконец, содержимое файла newfile ноэкранно выводится на терминал.

Конвейерная обработка нозволяет вынолнить те же самые действия, но без привлечения доцолнительных временных файлов outfile и newfile:

dir sort j йоге

В этом примере выходные данные команды dir подаются на вход команды sort, которая выполняет их сортировку. Затем отсортированные данные подаются на вход команды more для поэкранного отображения. При этом не требуется перенаправлять выходной цоток (>) BQ временный файл, нескольку оцерационная система сделает

все сама!

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

11 -с. эойие с оэацио системой 177



Программы на также могут участвовать в конвейерной обработке данных. Давайте создадим одну из таких программ, которая будет читать данные из стандартного входного потока, выполнять над ними определенные действия, а затем выводить в выходной поток, как показано в следующем примере:

/В scrt j perl Ittaler j nore

В этом конвейере программа Totaler написана rL (листинг 11.1). Она выполняет подсчет количества файлов в каталоге и их суммарный размер. В системе UNIX замените команду dir /В -1.

11.1. Исхсй тек згра1 Totaler

1: «l/usr/bin/perl

3: use strict;

4; my(5dirs,Ssizes,5total);

6: while(<STDIN>){ 7: chomp;

8: $tota;

9: if $ J { .

10: Sdirs++;

11: Erint 12: ne; 13: }

14: Ssizes+=(stat{$ ))[7]; 15: Eiit "S \n-; " 16: }

17: print "Воегоайшв - $total, кагатгав - $dicB\n";

18: print "Суммарний paa; байтов - ", $sizes/($total-jdirs), "\n";

Проведем анализ программы.

• Строка 6. В цикле выполняется чтение строк из стандартного входного потока. При этом каждая строка присваивается переменной $ . При потоковой обработке дескриптору STDIN текущей программы соответствует дескриптор STDOUT предыдущей. Таким образом, в пашем примере из дескриптора STDBSF .считываются данные, полученные в результате выполнения команды dir /В.

• Строка 13. Если встретился каталог, увеличим счетчик каталогов, находящийся в переменной Sdirs. При этом имя каталога распечатывается и цикл повторятся снова.

Строки В противном случае размер файла прибавляется к содержи-

мому переменной $sizes и имя файла распечатывается.

Строки Накопленные статистические данные (количество файлов,

каталогов и общий размер файлов) выводятся на печать.



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