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

$ = "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