Поиск

Вопросы и ответы

Почему приведенный ниже фрагмент программы не работает? Несмотря на то что в каталоге есть файлы, содержимое каталога не читается.

Проблема заключается во второй строке кода. Переменная DIRHANDLE является дескриптором каталога, а не файла! Содержимое каталога нельзя читать с помощью углового оператора (о). Чтобы исправить ошибку, замените вторую строку на

Почему функция glob("*.*") возвращает не все файлы, находящиеся в каталоге?

Потому что шаблон *.* соответствует только тем файлам, в имени которых содержится точка. Чтобы получить список всех файлов каталога, используйте конструкцию glob("*"). Функция glob и ее шаблоны реализованы в Perl так, чтобы обеспечить переносимость программ между разными компьютерными платформами. Поэтому шаблон *. * не соответствует его аналогу в MS-DOS.

Для выполнения поиска файлов во вложенных каталогах в программу пудгер была добавлена функция opendir и несколько модифицирован основной цикл. Однако в программе появились какие-то ошибки.

Если честно — вам не нужно с нуля писать такую программу. Задача обхода дерева каталогов уже давным-давно решена. И хотя она не из легких, существует множество ее решений. Поэтому незачем изобретать велосипед. Если же вы хотите просто попрактиковаться, обратитесь к материалу 15-го занятия, "Обработка данных в Perl". На нем рассмотрен модуль File::Find, облегчающий решение описанной задачи и, что более важно, ее последующую отладку.

Почему программа, описанная в листинге 10.3, выдает сообщение об ошибке при попытке переименования файлов *.bat в *.tmp?

Дело в том, что в качестве шаблона для поиска файлов нельзя использовать конструкцию *.bat, поскольку она не является корректным регулярным выражением. Звездочка должна обязательно следовать после какого-нибудь символа шаблона, ведь она обозначает факт повтора предыдущего символа. Если же ввести конструкцию \*\.bat, сообщение об ошибке исчезнет, но программа все равно работать не будет, поскольку вряд ли в вашем каталоге будет находиться файл, начинающийся с "*.bat". И вообще файлы, имена которых начинаются со звездочки, — скорее исключение, чем правило.

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

В результате будет запрещено использование специальных символов в регулярных выражениях, и они будут восприниматься как обычные литералы.