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


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



4.7. Поиск элементов одного массива, отсутствующих в другом массиве   127

Ниже показано, как обрабатывать данные по мере ввода. Мы используем who' для получения сведений о текущем списке пользователей, а перед обновлением хэша извлекаем из каждой строки имя пользователя:

#  Построить список зарегистрированных пользователей с удалением дубликатов
%ucnt = (),

for ( who )  {

s/\s *\n//,  # Стереть от первого пробела до конца строки -й остается имя пользователя

$ucnt{$_}++,  # Зафиксировать присутствие данного пользователя >

# Извлечь и вывести уникальные ключи
@users = sort keys %ucnt,

print users logged in @users\n ,

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

Раздел «Foreach Loops» perlsyn(l); описание функции keys вреИ/ипс(\). Анало­гичное применение хэшей продемонстрировано в рецептах 4.7 и 4.8.

4.7. Поиск элементов одного массива, отсутствующих в другом массиве

Проблема

Требуется найти элементы, которые присутствуют в одном массиве, но отсут­ствуют в другом.

Решение

Мы ищем элементы @А, которых пет в @>В. Постройте хэш из ключей @В — он будет использоваться в качестве таблицы просмотра. Затем проверьте каждый эле­мент @А и посмотрите, присутствует ли он в @>В.

Простейшая реализация

# Предполагается, что @А и @В уже загружены

%seen = (),      # Хэш для проверки принадлежности элемента В (Эаоп1у =(),      й Ответ

# Построить таблицу просмотра
foreach $item (@B) { $seen{$item} = 1 }

#  Найти элементы @А, отсутствующие в @В
foreach $item (@A) {

unless $item (@A) {

й Отсутствует в %seen, поэтому добавить в @aonly push(@aonly, $item),


128   Глава 4 • Массивы Идиоматическая версия

1my %seen,   # Таблица просмотра ray @aonly,  8 Ответ

й Построить таблицу просмотра @seen{@B} = ().

foreach $item (@А) {

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

Комментарий

Практически любая проблема, при которой требуется определить принадлеж­ность скалярной величины к списку или массиву, решается в Perl с помощью хэ-шей. Сначала мы обрабатываем @В и регистрируем в хэше %seen псе элементы @>В, присваивая соответствующему элементу хэша значение 1. Затем мы последо­вательно перебираем все элементы @А и проверяем, присутствует ли данный эле­мент в хэше %seen (то есть в @В).




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