Анимация
JavaScript
|
Главная Библионтека Операции открытия дескриптора файла и начала цикла можно заменить строкой 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 |