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

в этом примере показано также, что отдельные элементы хеша могут интерполироваться в строки в двойных кавычках. Весь хеш, однако, интерполировать таким образом нельзя*.

В скалярном контексте функция keys выдает число элементов (пар ключ-значение), содержащихся в хеше. Например, вы можете выяснить, пуст ли хеш, так:

if {keys (?,хеш) ) { # если keys () не равно 0: . . . ; # массив не пустой

# ... или ...

while (keys (%,Yeia) < 10) (

# продолжать цикл, пока меньше 10 элементов

Для того чтобы узнать, пуст хеш или нет, нужно просто использовать функцию %хеш в скалярном контексте:

if {-хеш) f # если "ncTifria", в нем что-то есть # что-то сделать

Функция values

Функция values (%имя массива) возвращает список всех текущих значений указанного массива в том же порядке, в каком функция keys ( %имя массива) возвращает ключи. Как всегда, круглые скобки не обязательны. Например:

"rlastname = () ; # сделать olastname пустым Slastname{"fred"} = "flintstone"; $lastname{"barney"} = "rubble";

Slastnames = values(llastname); # получить значения

Массив @lastnames будет содержать либо значения ("flintstone", "rubble"), либо ("rubble", "flintstone").

Функция each

Для выполнения цикла над всем хешем (т.е. для проверки каждого его элемента) можно использовать функцию keys и получать значения по возвращаемым ею ключам. Действительно, этот метод широко используется, но есть и более эффективный способ - функция each ( %имя хеша), которая возвращает пару ключ-значение как двухэлементный список. При каждом вычислении этой функции для одного хеша возвращается очередная пара ключ-значение, пока не будут проверены все элементы. Если пар больше нет, each возвращает пустой список.

Можно, в принципе, с помошью среза, но здесь о срезах мы не говорим

100 Ияцчасм Perl



Например, чтобы пройти по хешу %lastname из предыдущего примера, нужно использовать нечто такое:

while (($first,$last} = each(%lastname)) (

print "The last name of $first is $last\n";

Присваивание нового значения всему хешу заставляет функцию each перейти в его начало. Добавление элементов в хеш и удаление из него элементов в ходе выполнения цикла вполне может "запутать" функцию each (и вас, наверное, тоже).

Функция delete

Итак, вы можете добавлять элементы в хеш, но пока не можете удалять их (кроме как путем присваивания нового значения всему хешу). Для удаления элементов хеша в Perl используется функция delete. Операнд этой функции - хеш-ссылка, аналогичная той, которая используется для извлечения конкретного значения из хеша. Perl удаляет из хеша соответствующую ссылке пару ключ-значение. Например:

°Gfred = ( "aaa" , "bbb", 234 . 5, 34 . 56) ; # добавить в %fred два элемента

delete $fred{"aaa"}; # теперь в хеше %fred только одна пара ключ-значение

Срезы хешей

Как и в случае с переменной-массивом (или списочным литералом), можно воспользоваться срезом хеша, что даст возможность обращаться не к одному его элементу, а одновременно к набору элементов. Возьмем, к примеру, результаты игры в кегли:

$score("fred"} = 205; $score("barney"} = 195; 5score{ "dmo" } = 30;

Bee это можно записать одной строкой:

(.? score ( "fred" } , $score { "barney" }, $ score { "dino" }) = (205,195,30);

Ho даже она слишком длинна, поэтому давайте используем срез хеша:

$score{"fred","barney","dino"} = (205,195,30);

Вот так гораздо короче. Можно сочетать использование среза хеша и интерполяции переменных:

(3players = qw(fred barney dino);

print "scores are: @score(Oplayers}\n";

5. Xeiiin 101



Срезы хешей можно также использовать для слияния небольшого хеша с более крупным. В этом примере меньший хеш имеет приоритет в том смысле, что при наличии ключей-дубликатов используется значение из меньшего хеша:

@league{keys %scoret = values %score;

Здесь значения хеша %score сливаются с хешем %league. Это эквивалентно выполнению гораздо более медленной операции:

%league = (%league, %score); = # слить %score с %league

Упражнения

Ответы к упражнениям даны в приложении А.

Напишите программу, которая читает строку, а затем выводит эту строку и соответствующее ей значение согласно приведенной ниже таблице:

Ввод

Вывод

apple

green

leaves

blue

ocean

2. Напишите программу, которая читает ряд слов (по одному в строке) до конца файла, а затем выводит на экран сводку о том, сколько раз встретилось каждое слово. (Дополнительная задача: отсортируйте появляющиеся на экране слова по их ASCII-значениям в порядке возрастания последних.)



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