Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Вопросы по сложным структурам в Perl |
Автор: Suppir 14.6.2010, 20:21 |
Добрый день! У меня есть хеш хешей, который я составил следующим образом: $hash_А{$document_ID}{Date}=$date; $hash_А{$document_ID}{Code}=$code; $hash_А{$document_ID}{Size}=$size; Всего несколько тысяч уникальных $document_ID, и у каждого есть Date=>$date, Code=>$code, Size=>$size; Потом я составил $hash_B, который выглядит аналогично (но документы имеют другие значения) $hash_B{$document_ID}{Date}=$date; $hash_B{$document_ID}{Code}=$code; $hash_B{$document_ID}{Size}=$size; Необходимо: перебирая все $document_ID из $hash_A, найти аналогичный $document_ID в $hash_B; если у этих документов $date, $code и $size отличаются (хотя бы один из параметров), но выдать ошибку для данного $document_ID из $hash_A. |
Автор: Suppir 14.6.2010, 20:54 |
Забыл добавить: $document_ID в $hash_А и $document_ID в $hash_B могут отличаться регистром символов (это численно-буквенная строка, вроде "abc-12"). Для каждого $document_ID из $hash_А нужно искать аналогичный $document_ID из $hash_B без учета регистра. |
Автор: arto 14.6.2010, 20:54 |
перебирайте влоб: while (my ($aa,$bb) = each %hasA) { while (my ($aaa,$bbb) = each %hashB) { ... } } |
Автор: vadiml 15.6.2010, 17:26 |
Если Вы можете привести к одному регистру, то быстрее брать document_ID из 1-го хеша и для второго делать if ( exists $hash_B{$document_ID} ) { ... } |
Автор: Suppir 15.6.2010, 19:14 |
vadiml, document_ID и все остальные параметры нужно оставить как есть (регистр важен), но само сравнение нужно проводить без учета регистра. Я воспользовался советом arto, только перебирал через foreach $key(keys %hash_A) {} |
Автор: klem4 15.6.2010, 20:33 | ||
Как вариант:
|
Автор: Suppir 17.6.2010, 12:33 |
Подскажите, пожалуйста, как отсортировать хеш хешей? Есть хеш хешей следующего вида: $hash{$ID}{Type} $hash{$ID}{Name} $hash{$ID}{Date} $hash{$ID}{Code} Несколько тысяч ID. У каждого из них есть Type, Name, Date, Code. Необходимо сделать перебор хеша таким образом: foreach $key(keys $hash){ сделать что-то } При этом foreach должен выдавать нам элементы хеша в строгом порядке, учитывающим следующие приоритеты: 1. Type по алфавиту. 2. Date по убыванию даты (сначала самые свежие). Дата вида 8.04.2009 или 01.01.2010 3. Code по цифрам, чем больше цифра, тем больше приоритет 4. Name не учитываем. Т.е. в первую очередь нужно выдать ID, у которого Type начинается с буквы "А", дата максимально поздняя, Code максимально большой. |
Автор: ming 22.6.2010, 16:45 |
думаю вам нужно смотреть в сторону связывания (tie) http://search.cpan.org/~jgatcomb/Tie-Hash-Sorted-0.10/Sorted.pm |
Автор: KSURi 23.6.2010, 15:07 | ||
Хэши сортируются точно так же, как и все остальное.
|