Анимация
JavaScript
|
Главная Библионтека $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 |