Анимация
JavaScript
|
Главная Библионтека в этом примере показано также, что отдельные элементы хеша могут интерполироваться в строки в двойных кавычках. Весь хеш, однако, интерполировать таким образом нельзя*. В скалярном контексте функция 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 Упражнения Ответы к упражнениям даны в приложении А. Напишите программу, которая читает строку, а затем выводит эту строку и соответствующее ей значение согласно приведенной ниже таблице:
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 |