| Содержание | Предисловие | В |
Глава 12В этой главе:
Развертывание Дескрипторы каталогов Открытие и закрытие дескриптора каталога Чтение дескриптора каталога Упражнения Доступ к каталогамПеремещение по дереву каталогов Вы уже, вероятно, знакомы с понятием "текущий каталог" и с тем, как использовать команду cd shell. В системном прогФункция chdir в Perl принимает один аргумент —chdir("/etc") || die "cannot cd to /etc ($!)"; Круглые скобки не обязательны, поэтому можно обойтись и такой записью: print "where do you want to go? "; chomp($where = <STDIN>) ; if (chdir $where) f # получилось ) else {# не получилось >Вы не сможете определить, где вы находитесь, не запустив команду pwcf. О запуске команд мы расскажем в главе* Или не использовав функцию getcwd () из модуля Cwd.Для каждого процесса* назначается свой текущий каталог. Когда запускается новый процесс, он наследует текущий каталог своего родительского процесса, но на этом вся связь заканчивается. Если Per По умолчанию функция chdir без параметра делает текущим начальный каталог, почти так же, как команда cd shell.Развертывание Если в качестве аргумента в командной строке стоит звездочка (*), то shellПреобразование аргументов вроде * или /etc/host* в список соответст@а = </etc/host*> @а = glob("/de/host*");В списочном контексте, как показано выше, результатом развертывания является список всех имен, которые совпадают с образцом (как если бы shell> * Это справедливо для UNIX и большинства других современных операционных систем.Здесь возвращенные имена файлов начинаются с префикса, соответствующего пути доступа к ним (/etc/host), поэтому, если вам нwhile ($nextname = </etc/host*>) ( $nextname =~ s#.*/##; # удалить часть до последней косой чертыprint "one of the files is $nextname\n"; } Внутри аргумента допускается указывать несколько образцов; эти списки развертываются отдельно, а затем конкатенируются так, как будто это один большой список: @fred_barney_files = <fred* barney*>; Другими словами, эта операция развертывания выдает те же значения, которые возвратила бы эквивалентная ей команда echo с таХотя развертывание списка файлов и сопоставление с регулярным выражением осуществляются почти одинаково, специальные символы имеют совершенно разный смысл. Не путайте эти механизмы, иначе будете удивляться, почему вдруг <\ if (-d. "/usr/etc") ( $where = "/usr/etc"; } else ( $where = "/etc"; ) Sfiles = <$where/*>; Здесь переменной $ where присваивается одно из двух имен каталогов в зависимости от того, существует каталог <переменная $where является развертываемой, т.е. подлежащими развертыванию символами являются /etc/* илиЕсть одно исключение из этого правила: образец <$var> (который означает использование в качестве развертываемого выражения п* Для вас не будет сюрпризом узнать о том, что для выполнения развертывания Perl просто запускает** Конструкция <$fred> читает строку из дескриптора файла, заданного содержимым скалярной переменнойДескрипторы каталогов Если в вашей конкретной разновидности операционной системы имеется библиотечная функция readdir или ее функциональнДескриптор каталога представляет собой соединение с конкретным каталогом. Вместо чтения данных (как из дескриптора файла) вы используете дескриптор каталога для чтения списка имен файлов в этом каталоге. Дескрипторы каталогов всегда отк Если функции readdir() и ее аналогов в библиотеке нет (и при инсталляции языка Perl никакую замену вы нОткрытие и закрытие дескриптора каталога Функция opendir работает аналогично библиотечному вызову с тем же именем в С и C++.После этого обычно следуют разного рода манипуляции с дескриптором каталога etc, но сначала, наверное, нужно разобраться, как закрclosedir(ETC); Как и close, closedir часто оказывается ненужной, потому что все дескрипторы каталогов автоматически закрываются перед повторным оЧтение дескриптора каталога Открыв дескриптор каталога, мы можем прочитать список имен с помощью функции readdir, которая принимает единственный парамopendir(ETC,"/etc") II die "no etc?: $!"; while ($name = readdir(ETC)) f t скалярный контекст, по одному на циклprint "$name\n"; #выводит ., .., passwd, group и т.д. 1 closedir(ETC) ;А вот как можно получить все имена в алфавитном порядке с помощью функции sort:opendir(ETC,"/etc") || die "no etc?: $!"; foreach $name (sort readdir(ETC)) ( # списочный контекст с сортировкойprint "$name\n"; #выводит ., .., passwd, group и т.д. ) closedir(ETC) ;В этот список включены имена файлов, которые начинаются с точки. Это не похоже на результат развертывания, выполненного с использованием <*>,* Точнее говоря — это порядок, в котором имена файлов расположены в каталоге, т.е. тот же "беспорядочный пор** Это означает, что при работе с опцией-w вам придется использовать цикл while (defined($name = readdir (...)). Упражнения 1. Напишите программу, которая открывает каталог, заданный ее параметром, а затем выдает список имен файлов этого каталога в алфавитном порядке. (В случае, если переход в ка2. Модифицируйте программу так, чтобы она выдавала имена всех файлов, а не только те, имена которых не начинаются с точки. Попробуйте сделать это как с помощью операции развертывания, так и пос |
| Содержание | Предисловие | В |