Анимация
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

$count=l!

while(?name=glob(*)) { pdnt -Scount. $паше\в"; Scount++;

} •

Ниже приведен список основных отличий функции glob от opendir/readdir/closedir.

• Функция glob может возвращать только ограниченное количество файлов. Если в каталоге будет находиться большое количество файлов, эта функция, скорее всего, аварийно завершит свое выполнение. Причина состоит в том, что в текущей версии Perl функция glob реализована с помощью сценария оболочки С, который может возвращать только ограниченное количество

файлов. При использовании функций opendir/readdir/closedir подобная проблема не возникает.

• Функция glob возвращает имя файла вместе с путем, который указан в шаблоне, тогда как функции возвращают только имя файла. Например, оператор glob(/usr/include/*.h) к каждому возвращаемому имени файла добавляет путь /usr/include/.

• Функция glob работает медленнее, чем opendir/readdir/closedir. Причина очевидна. Perl должен запустить внешнюю программу, которая выполнит отбор и сортировку файлов, а затем получить от нее данные и интерпретировать их.

Итак, исходя из этого, какими же средствами лучше всего воспользоваться для отбора файлов? Ответ один - теми, которыми вам удобнее. Однако стоит иметь в виду,

что использование opendir/readdir/closedir позволяет создать более универсальный и гибкий код. Поэтому в большинстве примеров мы используем именно набор функций opendir/readdir/closedir.

Для полноты картины стоит упомянуть еще об одном способе отбора файлов. Просто поместите шаблон в угловые скобки (о); в результата товой оператор превратится в некое подобие оператора glob, например:

Отобрать все имена которых

t заканчиваются на ,с

Синтаксис углового оператора для отбора файлов является устаревшим, к тому же он может ввести в заблуждение кого угодно, поэтому им пользоваться не рекомендуется. Для ясности в примерах из данной книги мы пользовались оператором glob.

Упражнение: реализация утилиты UNIX grep

Мы постарались так подобрать примеры, чтобы по мере чтения книги вы приобретали опыт в создании полезных программ. В этом упражнении мы реализуем усеченную версию популярной утилиты системы Unix grep. Эта утилита выполняет поиск файлов, содержимое которых соответствует заданному шаблону (не путайте ее с одноименным оператором Perl). В рассматриваемом нами примере имя каталога и шаблон для поиска файлов вводятся в диалоговом режиме по запросу программы. Затем программа выполняет поиск файлов по заданному шаблону и выводит их на печать.



Запустите текстовый редактор, наберите в нем программу,, приведенную в листинге 10.1, и сохраните ее в файле mygrep. Не забудьте сделать файл выполняемым, ..как это было описано на 1-м занятии, "Начало работы с Perl". Убедитесь также, что вы

случайно не присвоили файлу с программой на Perl имя grep (иначе в системе UNIX будет конфликт с утилитой grep).

Завершив подготовительные действия, запустите программу с помощью следующей

команды: . ... ... .

perl mygrep

10.1. Ий текст згрмы! mygrep

1: I!/usr/bin/perl

2 : ,

3: use strict; "

4:

5: pclnt "Введгае иун каталога: ";

б: W $dir=<STDIN>; dxnp $dlrp

7: print "Введпе иаблон для пзЕка: ";

В: щ- $pat=<STDIN>j chatp

10: my ($fil); 11:

12: opendir(DH, $dir) 11 die "Qiiaапьшикагашга $dir: $!";

13: while($file=readdir DH) {

14: ifixt if (-d "Sdir/Sfile");

15: if (lopen(F, "Sdir/Sfile")) {

16: warn "Ошибка при открьпии файла $file: $!";

17: next

18: }

19: while(<F>){ ;

20: if (/$pat/J { . .r . .

21: print "$file: $ "

22: }

23: } ......

24: close(F);

25: } .... : .

26: closedinDHl; , ......

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

. :> f; \

Строка 1. В этой строке указывается путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и ключ -w. Всегда включайте режим вывода предупреждений!

• Строка 3. Директива use strict указывает, что все переменные должны быть явно объявлены в программе с помощью оператора ту и строки должны. быть заключены в кавычки. .

• Строки 5-8. В диалоговом режиме вводятся значения переменных /.$dir (каталог для поиска) и Spat (шаблон для поиска). Символ перевода удаляется с помощью функции chomp.



• Строка 10. Поскольку в начале программы указан оператор use strict, то здесь объявляется которая будет использоваться ниже в программе.

• Строка 12. Открывается каталог для чтения, указанный в переменной $dir. Если во время выполнения этой операции происходит ошибка, выводится

соответствующее сообшение.

• Строка 13. Элементы каталога считываются в цикле и помешаются в переменную $Ше.

• Строка 14. Элементы каталога, которые являются вложенными каталогами

(оператор -d), пропускаются. Обратите внимание, что в имени файла указан

путь ($dir/$file), поскольку текущий каталог может пе совпадать с каталогом $dir. Таким образом, полный путь к файлу задается в виде "$dir/$file".

• Строка 18. Открывается файл, указанный с помощью полного пути. Если происходит ошибка, выводится соответствующее сообшение и обработка

текущего файла прекращается.

• Строка 23. Файл сканируется построчно в поисках текста, соответствующего шаблону $pat. Найденные строки вместе с именем файла выводятся на печать.

Пример работы программы приведен в листинге 10.2.

ст 10.2. рЕб1 огреммы юудгер

ведите имя каталога: . Еоцте шаблон для поиска: pel hello: *l/usr/bin/perl lst02 01.pl: *!/usr/bin/perl -w

Каталоги

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

Перемещение по каталогам

При запуске какой-либо программы операционная система "запоминает" текущий каталог, в котором находился пользователь перед вводом команды. В системе UNIX после регистрации пользователь обычно попадает в свой рабочий каталог. Чтобы узнать, в каком каталоге вы находитесь, в системе UNIX используется команда pwd. При работе в режиме командной строки MS-DOS или Windows путь к текущему каталогу отображается в виде приглащения, например C:\WINDOWS>. Кроме того, если в сеансе MS-DOS ввести команду cd без параметров, операционная система выведет на экран путь к текущему каталогу. Таким образом, каталог, используемый по умолчанию системой в настоящий момент, называется текущим каталогом.

160 Чть И. углубляемся e 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