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. Вычисление объединения, пересечения и разности уникальных списков
Проблема
Имеются два списка, каждый из которых содержит неповторяющиеся элементы. Требуется узнать, какие элементы присутствуют в обоих списках (пересечение), присутствуют в одном и отсутствуют в другом списке (разность) или хотя бы в одном нз списков (объединение).
