Почему приведенный ниже фрагмент программы не работает? Несмотря на то что в каталоге есть файлы, содержимое каталога не читается.
Проблема заключается во второй строке кода. Переменная DIRHANDLE является дескриптором каталога, а не файла! Содержимое каталога нельзя читать с помощью углового оператора (о). Чтобы исправить ошибку, замените вторую строку на
Почему функция glob(“*.*”) возвращает не все файлы, находящиеся в каталоге?
Потому что шаблон *.* соответствует только тем файлам, в имени которых содержится точка. Чтобы получить список всех файлов каталога, используйте конструкцию glob(“*”). Функция glob и ее шаблоны реализованы в Perl так, чтобы обеспечить переносимость программ между разными компьютерными платформами. Поэтому шаблон *. * не соответствует его аналогу в MS-DOS.
Для выполнения поиска файлов во вложенных каталогах в программу пудгер была добавлена функция opendir и несколько модифицирован основной цикл. Однако в программе появились какие-то ошибки.
Если честно — вам не нужно с нуля писать такую программу. Задача обхода дерева каталогов уже давным-давно решена. И хотя она не из легких, существует множество ее решений. Поэтому незачем изобретать велосипед. Если же вы хотите просто попрактиковаться, обратитесь к материалу 15-го занятия, “Обработка данных в Perl”. На нем рассмотрен модуль File::Find, облегчающий решение описанной задачи и, что более важно, ее последующую отладку.
Почему программа, описанная в листинге 10.3, выдает сообщение об ошибке при попытке переименования файлов *.bat в *.tmp?
Дело в том, что в качестве шаблона для поиска файлов нельзя использовать конструкцию *.bat, поскольку она не является корректным регулярным выражением. Звездочка должна обязательно следовать после какого-нибудь символа шаблона, ведь она обозначает факт повтора предыдущего символа. Если же ввести конструкцию *.bat, сообщение об ошибке исчезнет, но программа все равно работать не будет, поскольку вряд ли в вашем каталоге будет находиться файл, начинающийся с “*.bat”. И вообще файлы, имена которых начинаются со звездочки, — скорее исключение, чем правило.
Для решения проблемы либо введите корректный шаблон, либо измените строку 19 программы следующим образом:
В результате будет запрещено использование специальных символов в регулярных выражениях, и они будут восприниматься как обычные литералы.