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


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


%surname =  (    Mickey'   =>    Mantle ,   "Babe    => 'Ruth  ), %first_name =  reverse %surname, print  $first_narae{"Mantle' ,    '\n", Mickey

Если интерпретировать %surname как список, мы получим следующее:

('Mickey",   "Mantle',   "Babe',    'Ruth")

(а может быть, ("Babe",   "Ruth",   "Mickey",   "Mantle' ), поскольку порядок элемен­тов непредсказуем). После инвертирования список выглядит так:

('Ruth',   "Babe",   'Mantle",    'Mickey')

Интерпретация его в качестве хэша дает следующее:

('Ruth'   =>  "Babe',    'Mantle" =>   'Mickey')

В примере 5.2 приведена программа foodfind. Если передать ей название продук­та, она сообщает цвет, а если передать цвет — она сообщает название.

Пример 5.2. foodfind

#' /usr/bm/perl -w

# foodfind - поиск продуктов по названию или цвету

$given = shift @ARGV or die 'usage foodfind food_or_color\n ;

%color = (

'Apple ' => "red' ,


5.9. Сортировка хэша    165

"Banana" => "yellow', "Lemon' => 'yellow", "Carrot" =>   'orange'

%food = reverse %color,

if (exists $color{$given}) {

print "$given is a food with color $color{$given} \n',

>

if (exists $food{$given>) {

print '$food{$given} is a food with color $given \n' ; }

Если два ключа исходного хэша имеют одинаковые значения ("Lemon' и "Banana" в предыдущем примере), то инвертированный хэш будет содержать лишь один из них (какой именно — зависит от порядка хэширования, так что непредсказуемо). Дело в том, что хэши в Perl по определению имеют уникальные ключи.

Чтобы инвертировать хэш с повторяющимися значениями, следует воспользо­ваться методикой рецепта 5.7 — то есть построить хэш, ассоциированные значе­ния которого представляют собой списки ключей исходного хэша:

# Хэш %food_color определяется во введении while  (($food,$color)  = each(%food_color))   { push(@{foods_with_color{$color}},   $food),




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



Книжный магазин