PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 155


Пример 5.1. countfrom

й1 /usr/bin/perl

# countfrom - подсчет сообщений от каждого отправителя

$filename = $ARGV[O]   ||    - ,

open(FILE,    <$filename )                   or die   Can t open $filename     $'   ,

while(<FILE>)   {

if (/"From    (  *)/)  {  $from<$1}++ }

foreach $person  (sort keys %from)  { print    $person    $from{$person}\n


160   Глава 5 • Хэши

 Смотри также

Описание функций each и keys в perlfunc(i); описание циклов for и foreach в рецепте 4.5.

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

Проблема

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

Решение

Одно из возможных решений — перебрать все пары «ключ/значение» в хэше (см. рецепт 5.4) и вывести их:

while ( ($k $v) = each %hash) {

print $k => $v\n }

Также можно построить список строк с помощью тар:

print тар  {    $_ => $hash{$_}\n    }  keys %hash

Или воспользуйтесь фокусом из рецепта 1.10 и интерполируйте хэш как список:

print    @{[  %hash  ]}\n

Или сохраните хэш во временном массиве и выведите его:

{

my @temp = %hash, print    istemp ,

Комментарий

Все перечисленные приемы обладают различными возможностями по управле­нию порядком и форматированием вывода, а гакже различно]"! эффективностью.

Первый способ (перебор хэша) чрезвычайно гибок и эффективен по затратам памяти Вы можете как угодно форматировать выходные данные, при этом пона­добятся всего две скалярные переменные — текущий ключ и значение. Использо­вание цикла foreach позволяет вывести хэш с упорядочением ключей (ценой по­строения отсортированного списка):

foreach $k  (sort keys %hash)  { print    $k => $hash{$k}\n , >

Функция map не уступает перебору по богатству возможностей Сортиров­ка ключей по-прежнему позволяет работать с элементами в произвольном поряд­ке. Выходные данные можно как угодно форматировать. На этот раз создается


5.6. Перебор элементов хэша в порядке вставки   161

список строк (например,   КЛЮЧ=>ЗНАЧЕНИЕ , как в приведенном выше примере), пе­редаваемый print




- Начало -  - Назад -  - Вперед -