Анимация
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

Операции открытия дескриптора файла и начала цикла можно заменить строкой

foreach $ { who ) {

С тем же результатом. Единственное различие состоит в том, что вариант программы с использованием дескриптора файла может приступить к работе, как только who начнет выдавать символы, тогда как в варианте с функцией who в обратных кавычках придется ждать завершения выполнения функции who.

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

open(PW,"/etc/passwd"); while (<PW>) { chomp;

{$user,$gcos) = (split /:/)[0,4]; ($real) = split (/,/, $gcos) ; $real{$user) = $real;

close(PW),

open(LPR,"IIpr") i I die "cannot open LPR pipe"; open(WHO,"who 1") i I die "cannot open who pipe"; while (<WHO>) {

# или заменить предыдущие две строки на foreach $ (who) { ($login, $rest) = /" (\S + )\s+(.*)/;

$login = $real{$login) if $real{$login};

printf LPR "%-30s %s\n",$login,$rest;

Разница между этой программой и программой из предьщушего упражнения состоит в том, что мы добавили дескриптор файла LPR, открытый для процесса Ipr, и модифицировали оператор printf так, чтобы он посылал данные не в STDOUT, а в этот дескриптор.

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

sub mkdir {

system "/bm/mkdir", I3 ;

Здесь команда mkdir получает аргументы прямо из аргументов подпрофам-мы. Однако возврашаемое значение должно подвергнуться операции логического отрицания, потому что ненулевой код выхода из system должен быть преобразован в значение "ложь" для вызываюшей Perl-профаммы.

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

sub mkdir {

my($dir, $mode) = I3 ;

(system "/bm/mkdir", $dir) && chmod ($mode, $dir) ,



Сначала мы описываем локальные аргументы этой подпрограммы - $dir и $mode. Затем мы вызываем mkdir для каталога с именем $dir. В случае успеха операция chmod присваивает этому каталогу соответствующие права доступа.

Глава 15 Другие операции преобразования данных "

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

while (О) { chomp;

$slash = rindex($ ,"/"); if ($slash > -1) {

$head = substr($ ,0,$slash) ;

$tail = substr($ ,$slash+l) ; ) else {

($head,$tail) = ("", $ );

print "head = $head, tail = $tail\n";

Каждая строка, прочитанная операцией "ромб", сначала пропускается через операцию chomp, которая удаляет символ новой строки. Затем с помощью rindex () мы ищем в этой строке крайнюю справа косую черту. Следующие две строки разбивают строку на части, используя substr (). Если косой черты нет, то результат г index равен -1, и этот вариант мы не рассматриваем. Последняя строка цикла выводит результат.

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

chomp(gnums = <STDIN>); # обратите внимание на особый случай

# использования chomp @nums = sort { $а <=> $b } gnums; foreach (gnums) {

printf "%30g\n", $ ;

В первой строке в массив @nums вводятся все числа. Во второй строке этот массив сортируется в числовом порядке, для чего используется встроенный оператор. Цикл foreach обеспечивает вывод результатов.

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

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

{$user, $gcos) = (split /:/)[0,4]; (Sreal) = split(/,/, $gcos); $real{$user) = $real; ($last) = (split /\s+/, $real)[-l];



Slast($user) = "\L$last";

close(PW);

for (sort by last keys %last) {

printf "%30s %8s\n", $real($ ), $ ;

sub by last { ($last{$a) cmp $last{$b)) I I {$a cmp $b) )

В первом цикле создается хеш %last, ключи которого - регистрационные имена, а соответствующие им значения - фамилии пользователей, и хеш %геа1, содержащий полные реальные имена пользователей. Все символы переводятся в нижний регистр, чтобы, к примеру, FLINTSTONE, Flintstone и flintstone стояли рядом друг с другом.

Во втором цикле выводится %геа1, упорядоченный по значениям %last. Это делается с использованием определения сортировки, предоставленного подпрограммой bylast.

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

while (О) {

substr($ ,0,1) =- tr/a-z/A-Z/; substr($ ,1) =~ tr/A-Z/a-z/; print;

Для каждой строки, прочитанной операцией "ромб", мы используем две операции tr - по одной для разных частей строки. Первая операция tr переводит первый символ строки в верхний регистр, а вторая переводит все остальные символы в нижний регистр. Результат выводится.

Вот другое решение, с использованием только строковых операций с двойными кавычками:

while (О) {

print "\u\L$ ";

Если вы самостоятельно нашли это решение, поставьте себе дополнительно пять баллов.

Глава 16 "Доступ к системным базам данных "

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

$: = " ";

while (@pw = getpwent) {



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