Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [ 88 ] 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

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

while (О) (

chomp; # удалить символ новой строки print "$ IS readableXn" if -г; print "$ is writableXn" if -w; print "$ is executableXn" if -x; print "$ does not exist\n" unless -e;

При каждом выполнении цикла while читается имя файла. После удаления символа новой строки файл проверяется (с помощью остальных операторов) на наличие различных прав доступа.

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

while (О) ( chomp; $age = -М;

if ($oldest age < $age) ( $oldest name = $ ; $oldest age = $age;

print "The oldest file is $oldest name ", "and is $oldest age days old.\n";

Сначала мы выполняем цикл для каждого считываемого имени файла Символ новой строки отбрасывается, а затем с помощью операции -м вычисляется возраст файла в днях. Если возраст превышает возраст самого старого из файлов, которые мы до сих пор видели, мы запоминаем имя файла и его возраст. Первоначально $oldest age = О, поэтому мы рассчитываем на то, что имеется хотя бы один файл, возраст которого больше О дней.

По завершении цикла оператор print выдает отчет.

Глава 11 "Форматы"

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

open (PW,"/etc/passwd") I I die "How did you get logged in?"; while (<PW>) (

($user,$uid, $gcos) = (split /:/) [0,2,4];

($real) = split /,/,Sgcos;

write;

format STDOUT =

&«««< (J»»» (a<<<<<<<<<<<<<<«<<<<«<<<<«<< $user, $uid, $real



Первая строка открывает файл паролей. В цикле while этот файл обрабатывается построчно. Для того чтобы можно было загрузить скалярные переменные, каждая строка разбивается на части; в качестве разделителя используется двоеточие. Реальное имя пользователя выбирается из поля GCOS. Последний оператор цикла while вызывает функцию write для вывода всех данных.

Формат дескриптора файла stdout определяет простую строку с тремя полями. Их значения берутся из трех скалярных переменных, значения которым присваиваются в цикле while.

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

# прибавить к программе из первой задачи... format STDOUT TOP = Username User ID Real Name

Bee, что нужно для добавления к предыдущей программе заголовков страниц,- это добавить формат начала страницы. Указанным выражением мы помещаем заголовки в столбцы.

Чтобы выровнять столбцы, мы скопировали текст формата stdout и, используя в нашем текстовом редакторе режим замены, заменили поля @<<< линиями ====.Это можно сделать благодаря существованию посимвольного соответствия между форматом и получаемым результатом.

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

# прибавить к программе из первой задачи... format STDOUT TOP = Page @<<< $%

Username User ID Real Name

Здесь для получения заголовков страниц мы опять-таки ввели формат начала страницы. Этот формат содержит также ссылку на переменную $%, которая автоматически присваивает странице номер.

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

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

print "Where to? "; chomp($newdir = <STDIN>);

chdir($newdir) die "Cannot chdir to $newdir: $!"; Приложение A. Ответы к упражнениям 277



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

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

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

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

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

print "Where to? "; chomp($newdir = <STDIN>); chdir($newdir)

die "Cannot chdir to $newdir: $"; opendir(DOT,".") II

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: $i"; foreach (sort <* .*>) ( print "$ \n";

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [ 88 ] 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103