Вывод содержимого хэша

Проблема

Требуется вывести содержимое хэша, однако конструкции print "%ХЭШ" и print %ХЭШ не работают.

Решение

Одно из возможных решений — перебрать все пары «ключ/значение» в хэше и вывести их:
while ( ($k,$v) = each %hash) {
  print "$k => $v\n";
}
Также можно построить список строк с помощью map:
print map { "$_ => $hash{$_\n" } keys %hash;
Или интерполируйте хэш как список:
print "@{[ %hash ]}\n";
Или сохраните хэш во временном массиве и выведите его:
{
my @temp = %hash;
print "@temp";
}

Комментарий

Все перечисленные приемы обладают различными возможностями по управленю порядком и форматированием вывода, а также различной эффективностью.
Первый способ (перебор хэша) чрезвычайно гибок и эффективен по затратам памяти. Вы можете как угодно форматировать выходные данные, при этом понадобятся всего две скалярные переменные — текущий ключ и значение. Использованне цикла foreach позволяет вывести хэш с упорядочением ключей (ценой построения отсортированного списка):
foreach $k (sort keys %hash) {
print "$k => $hash{$k}\n";
}
Функция map не уступает перебору по богатству возможностей. Сортировка ключей по-прежнему позволяет работать с элементами в произвольном порядке. Выходные данные можно как угодно форматировать. На этот раз создается список строк (например, "КЛЮЧ=>ЗНАЧЕНИЕ", как в приведенном выше примере), передаваемый print.
Два последних приема представляют собой фокусы, связанные с интерполяцией. Интерпретация хэша как списка не позволяет предсказать или управлять порядком вывода пар «ключ/значение». Более того, данные в этом случае выводятся в виде списка ключей и значений, элементы которого разделяются текущим содержимым переменной $". В отличие от других приемов, вам не удастся вывести каждую пару на новой строке или отделить ключи от значений символом =>.

См. также

Описание функций map, keys, sort и each



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: