Анимация
JavaScript
|
Главная Библионтека $ = "fred and barney"; $count = tr/a-z ; # $ не изменилась, но $count ~ 13 $count2 = tr/a-z/A-Z/; # $ переведена в верхний регистр, и $count2 = 13 Если в конце операции добавить букву с (как мы добавляли букву d), символы старой строки будут рассматриваться как исключение из набора всех 256 символов. Каждый символ, указанный в старой строке, удаляется из сововсупности всех возможных символов; оставшиеся символы, взятые по порядку от младшего к старшему, образуют новую строку-результат. Например, подсчитать или изменить в нашей строке все символы, не являющиеся буквами, можно так: $ = "fred and barney"; $count = tr/a-z c; # $ не изменилась, но $count = 2 tr/a-z/ /c; # $ теперь содержит "fred and barney" (символы-небуквы => ) tr/a-z cd; # $ теперь содержит "fredandbarney" (символы-небуквы удалены) Отметим, что эти опции можно объединять, как показано в последнем примере, где мы сначала меняем совокупность символов на "дополняющую" (список букв становится списком всех символов-небукв), а затем с помощью опции d удаляем все символы этой совокупности. Последняя опция операции tr / - s, которая заменяет множество экземпляров одной преобразованной буквы одним. Например: $ = "aaabbbcccdef gill" ; tr/defghi/abcddd/s; # $ теперь содержит "aaabbbcccabcd" Обратите внимание: буквы def заменены на abc, а ghi (которые без опции S превратились бы в ddd) стали одной буквой d. Отметим также, что стоящие друг за другом буквы в первой части строки "не сжимаются", потому что для них не задано преобразование. Вот еще несколько примеров: $ = "fred and barney, wilma and betty"; tr/a-z/X/s; # $ теперь содержит "X X X, X X X" $ = "fred and barney, wilma and betty"; tr/a-z/ /cs; # $ теперь содержит "fred and barney wilma and betty" В первом из этих примеров каждое слово (стоящие друг за другом буквы) было заменено одной буквой х. Во втором примере все группы стоящих друг за другом символов-небукв стали одиночными знаками подчеркивания. Как и команда s /, операция tr может быть проведена над другой строкой, а не только над строкой, хранящейся в переменной $ . Это достигается с помощью операции =~: $names = "fred and barney"; $names =~ tr/aeiou/X/; # $names теперь содержит "frXd Xnd bXrnXy" Упражнения Ответы к упражнениям см. в приложении А. 1. Напишите программу, которая читает список имен файлов и разбивает каждое имя на начальный и конечный компоненты. (Все, что стоит в имени файла до последней косой черты - начальный компонент, а все, что за ней - конечный компонент. Если косой нет, то все имя является конечным компонентом.) Попробуйте выполнить эту программу с именами вроде /fred, barney, fred/barney. Имеют ли результаты смысл? 2. Напишите программу, которая читает список чисел, стоящих в отдельных строках, и сортирует их по числовым значениям, выводя список-результат в столбец с выравниванием справа. (Совет: для вывода столбца с выравниванием справа нужно использовать формат наподобие %2 0д.) 3. Напишите программу вывода реальных и регистрационных имен пользователей из файла /etc/passwd с сортировкой по фамилиям пользователей. Работоспособно ли ваше решение в случае, если у двух пользователей одинаковые фамилии? 4. Создайте файл, состоящий из предложений, каждое из которых стоит в отдельной строке. Напишите программу, которая переводит первый символ каждого предложения в верхний регистр, а остальную часть предложения - в нижний. (Работает ли эта программа в случае, если первый символ - небуква? Как решить эту задачу, если предложения не стоят в отдельных строках?) в эпюй главе: • Получение информации о паролях и группах • Упаковка и распаковка двоичных данных • Получение информации о сети • Упражнение Доступ к системным базам данных Получение информации о паролях и группах Информация о вашем пользовательском имени и идентификаторе, которая имеется в системе UNIX, практически открыта. По сути дела, любая программа, которая не сочтет за труд заглянуть в файл /etc/passwd, поможет вам увидеть почти все, кроме незашифрованного пароля. Этот файл имеет особый формат, определяемый в passwd(5), и выглядит приблизительно так; name:passwd:uid:gid:gcos:dir:shell Поля определены следующим образом; name Регистрационное имя пользователя passwd Зашифрованный пароль или что-нибудь простое, если используется теневой файл паролей Идентификатор пользователя (для пользователя root - О, для обычных пользователей - ненулевое число) 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 |