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


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


delete @food_color{ Banana   Apple   Cabbage },

\> Смотри также--------------------------------------------------------------------------------------------

Описание функций delete и keys в perlfunc(l). Применение keys продемонст­рировано в рецепте 5.4.

5.4. Перебор хэша

Проблема

Требуется выполнить некоторые действия с каждым элементом (то есть парой «ключ/значение») хэша.


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

Решение

Воспользуйтесь функцией each в цикле while:

и/1и1е(($КЛЮЧ,   $ЗНАЧЕНИЕ)  = each(%X3UJ))  {

#  Сделать что-то с $КЛЮЧ и $ЗНАЧЕНИЕ
}

Если хэш не очень велик, можно вызвать keys в цикле f о reach:

fо reach $КЛЮЧ    (keys %ХЭШ)  {

$ЗНАЧЕНИЕ   = $ХЭШ{$ШЧ}

#  Сделать   что-то с $КЛЮЧ и $ЗНАЧЕНИЕ
}

Комментарий

Следующий простой пример перебирает элементы хэша %food_color из введе­ния:

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

print $food is Scolor \n , }

Banana is yellow. Apple is red. Carrot is orange. Lemon is yellow.

В примере с f о reach можно обойтись без переменной $color, поскольку она ис­пользуется всего один раз. Достаточно написать:

print    $food is $food_color{$food} \n .

При каждом вызове each для одного и того же хэша функция возвращает «сле­дующую» пару ключ/значение. Слово «следующую» взято в кавычки, потому что пары возвращаются в порядке, соответствующем внутренней структуре хэша, и этот порядок почти никогда не совпадает с числовым или алфавитным. За послед­ним элементом each возвращает пустой список (); результат интерпретируется как ложный, и цикл while завершается.

В примере с foreach использована функция keys, которая строит список всех ключей из хэша еще перед началом выполнения цикла. Преимущество each заклю­чается в том, что пары «ключ/значение» извлекаются по одной. Если хэш содер­жит много ключей, отказ от предварительного построения полного списка суще­ственно экономит память и время. Однако функция each не позволяет управлять порядком обработки пар.




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