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


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


В приведенном фрагменте ответ будет содержать дубликаты из массива @А. Ситуацию нетрудно исправить, для этого достаточно включать элементы @А в %seen но мере обработки:

foreach $item (@A)  {

push  (@aonly,   $item)  unless $seen{$item},

$seen{$item} =1                  8 Пометить как уже встречавшийся

}

Эти решения в основном отличаются по способу построения хэша. В пер­вом варианте перебирается содержимое @>В. Во втором для инициализации хэша используется срез. Следующий пример наглядно демонстрирует срезы хэша. Фрагмент:

$hash{ key1 } = 1, $hash{ key2 > = 2,

эквивалентен следующему:

gnash{  key1   ,     key2 }  =  (1,2),

Список в фигурных скобках содержит ключи, а список справа — значения. В первом решении %seen инициализируется перебором всех элементов @В и при­сваиванием соответствующим элементам %seen значения 1. Во втором мы просто говорим:

@seen{@iB> = ()

В этом случае элементы @>В используются в качестве ключей для %seen, а с ними ассоциируется undef, поскольку количество значений в правой части меньше количества позиций для их размещения. Показанный вариант работает,


4.8. Вычисление объединения, пересечения и разности уникальных списков    129

поскольку мы проверяем только факт существования ключа, а не его логичес­кую истинность или определенность. Но даже если с элементами @В потре­буется ассоциировать истинные значения, срез все равно позволит сократить объем кода:

@seen{§B} = (1) х @В,

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

Описание срезов хэшей в perldata(i). Аналогичное применение хэшей проде­монстрировано в рецептах 4.7 и 4.8.

4.8. Вычисление объединения, пересечения и разности уникальных списков

Проблема

Имеются два списка, каждый из которых содержит неповторяющиеся элементы. Требуется узнать, какие элементы присутствуют в обоих списках (пересечение), присутствуют в одном и отсутствуют в другом списке (разность) или хотя бы в одном нз списков (объединение).




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