Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Хэши
Хэши и списки
Так как весь хэш, его ключи или значения можно легко преобразовать в список, то для обработки хэшей можно применять любые функции, работающие со списками. Именно поэтому в предыдущем примере была применена функция reverse. Например, вывести ключи и значения хэша на печать можно так:
{ # организовать блок, где объявить временный массив my @temp = %hash; # сохранить в нем хэш print "@temp"; # и передать его функции print } # по выходе из блока временный массив будет уничтожен
Можно напечатать хэш по-другому, построчно и в более облагороженном виде, при помощи функции map, которая также выполняет роль итератора:
print map {"Ключ: $_ значение: $hash{$_}\n" } keys %hash;
В этом примере на основании списка ключей, возвращенного функцией keys, функция map формирует список нужных строк, вставляя из хэша в каждую из них ключ и значение. Она возвращает сформированный список функции print, которая выводит его в выходной поток. Кстати, это типичный для Perl прием - обрабатывать данные при помощи цепочки функций, когда результат работы одной функции передается на обработку другой, как это принято делать с помощью конвейеров команд в операционных системах семейства Unix.
В приведенных выше примерах при необходимости обработки ключей хэша в алфавитном порядке они сортировались с помощью функции sort. Вот пример обработки хэша в порядке возрастания не его ключей, а его значений:
foreach $key ( # каждый элемент списка, sort # отсортированный по порядку {$hash{$a} cmp $hash{$b}}# значений, ассоциированных keys %hash) { # с ключами хэша print "значение:$hash{$key} ключ:$key\n"; # обработать } # в цикле
Здесь в блоке сравнения функции sort сопоставляется значения хэша, ассоциированные с очередными двумя ключами из списка, который предоставлен функцией keys.
Срезы хэшей
Подобно тому, как при работе с массивами срезы позволяют работать со списком элементов, в Perl есть возможность обращаться сразу с несколькими элементами хэша. Это делается с помощью среза хэша. Срез хэша (hash slice) - это список значений хэша, заданный перечнем соответствующих ключей. Он записывается в виде имени хэша с префиксом @ (так как срез - это список), за которым в фигурных скобках перечисляются ключи. Список ключей в срезе хэша можно задать перечислением скалярных значений, переменной-списком или списком, возвращенным функцией. Например, так:
@hash{$key3, $key7, $key1} # срез хэша задан списком ключей @hash{@key_values} # срез хэша задан массивом @hash{keys %hash} # то же, что values(%hash)
Если в срезе хэша список ключей состоит из единственного ключа, срез все равно является списком, хотя и из одного значения. Сравните:
@hash{$key} # срез хэша, заданный списком из одного ключа $hash{$key} # значение элемента хэша, заданное ключом
Поскольку переменная-хэш в составе строки не интерполируется, для вставки в строку всех значений хэша можно воспользоваться срезом хэша:
%hash = ('0' => 'false', '1' => 'true'); "@hash{keys %hash}"; # будет "false true" или "true false"
Срез хэша, как и любой другой список, может стоять в левой части операции присваивания. При этом списку ключей среза должен соответствовать список присваиваемых значений в правой части присваивания. Воспользовавшись срезом, можно добавить в хэш сразу несколько пар или объединить два хэша, добавив к одному другой. Например:
@hash{$k1, $k2, $k3}= ($v1, $v2, $v3); # добавить список @old{keys %new}= values %new; # добавить хэш %new к %old
С помощью среза хэша и функций keys и values можно поменять в хэше местами ключи и значения, то есть сделать значения ключами, а ключи - значениями.
@hash_keys = keys %hash; # сохранить ключи в массиве @hash_values = values %hash; # сохранить список значений %hash = (); # очистить хэш @hash{@hash_values}=@hash_keys; # срезу хэша присвоить список
Специальные хэши
Исполняющая система Perl предоставляет программисту доступ к специальным ассоциативным массивам, в которых хранится полезная служебная информация. Вот некоторые из специальных хэшей:
%ENV перечень системных переменных окружения (например, PATH) %INC перечень внешних программ, подключаемых по require или do %SIG используется для установки обработчиков сигналов от процессов
Например, так при выполнении программы можно использовать значения переменных окружения: перечислить все их значения или выбрать нужные.
foreach my $name (keys %ENV) { print "$name=$ENV{$name}\n"; } ($who, $home) = @ENV{"USER", "HOME"}; # под Unix ($who, $home) = @ENV{"USERNAME", "HOMEPATH"}; # и Windows XP