Поиск

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

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

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

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

perl mygrep

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

  • Строка 1. В этой строке указывается путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и ключ -W. Всегда включайте режим вывода предупреждений!
  • Строка 3. Директива use strict указывает, что все переменные должны быть явно объявлены в программе с помощью оператора mу и строки должны быть заключены в кавычки.
  • Строки 5-8. В диалоговом режиме вводятся значения переменных. $dir (каталог для поиска) и Spat (шаблон для поиска). Символ перевода строки удаляется с помощью функции chomp.
  • Строка 10. Поскольку в начале программы указан оператор use strict, то здесь объявляется переменная $file, которая будет использоваться ниже в программе.
  • Строка 12. Открывается каталог для чтения, указанный в переменной $dir. Если во время выполнения этой операции происходит ошибка, выводится соответствующее сообшение.
  • Строка 13. Элементы каталога считываются в цикле и помешаются в переменную $Ше.
  • Строка 14. Элементы каталога, которые являются вложенными каталогами (оператор -d), пропускаются. Обратите внимание, что в имени файла указан путь ($dir/$file), поскольку текущий каталог может не совпадать с каталогом $dir. Таким образом, полный путь к файлу задается в виде "$dir/$file".
  • Строки 15~18. Открывается файл, указанный с помощью полного пути. Если происходит ошибка, выводится соответствующее сообшение и обработка текущего файла прекращается.
  • Строки 19—23. Файл сканируется построчно в поисках текста, соответствующего шаблону $pat. Найденные строки вместе с именем файла выводятся на печать.

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