Анимация
JavaScript
|
Главная Библионтека 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 |