Изучаем Perl

975b8bba

Доступ к каталогам"


1. Вот один из способов решения этой задачи:

print "Where to? ";

chomp($newdir = <STDIN>) ;

chdir($newdir) II die "Cannot chdir to $newdir: $!";

foreach (<*>) { print "$_\n";

}

В первых двух строках запрашивается и считывается имя каталога.

С помощью третьей строки мы пытаемся перейти в каталог с указанным именем. В случае неудачи программа аварийно завершается.

В цикле foreach осуществляется проход по списку. Но что это за список? Это развертывание в списочном контексте, в результате которого мы получим список всех имен файлов, совпадающих с образцом (в данном случае он задан как *).

2. Вот один из способов решения этой задачи — с помощью дескриптора каталога:

print "Where to? ";

chomp ($newdir = <STDIN>) ;

chdir($newdir) ||



die "Cannot chdir to $newdir: $!";

opendir(DOT,".") |I

die "Cannot opendir . (serious dainbramage): $!";

foreach (sort readdir(DOT)) { print "$_\n";

) closedir(DOT) ;

Так же, как в предыдущей программе, мы запрашиваем новый каталог. Перейдя в него посредством команды chdir, мы открываем каталог, создавая дескриптор каталога dot. В цикле foreach список, возвращенный функцией readdir (в списочном контексте) сортируется, а затем просматривается с присваиванием переменной $_ значения каждого элемента.

А вот как сделать это с помощью развертывания:

print "Where to? ";

chomp($newdir = <STDIN>) ;

chdir($newdir) || die "Cannot chdir to $newdir: $!";

foreach (sort <* .*>) ( print "$_\n";

)

Да, это, по сути дела, еще одна программа из предыдущего упражнения, но мы вставили перед операцией развертывания операцию sort и дополнили образец символами .*, чтобы найти файлы, имена которых начинаются с точки. Операция sort нам нужна по той причине, что файл !fred должен стоять перед точечными файлами, a barney —после них, но простого способа, позволяющего расставить их в таком порядке при помощи shell, нет.



Содержание раздела