| Цитата | но у меня значения хэшей не по одному значению
|
И что? Всё верно, у тебя значение второго хеша будет добавляться к значению первого, если в первом хеше есть запись с ключём $key, если же её там нет, то будет создан этот ключь и ему просто присваивается новое значение, т.е. $val из второго хеша. Или тебе нужно что бы в значениях первого хеша не пересекались имена, т.е. что бы добавлялись только те имена, которых в нём нет? Если да, то делай значение в виде анонимного хеша, это даст нам возможность узнать сколько пересекались имена и в то же время они не будут пересечены. О загнул. 
| Код | #!/usr/bin/perl -w use strict;
my %hash1 = ( name1 => {"Vasya" => 0, "Masha" => 0, }, name2 => {"Kolya" => 0, }, name3 => {"Sasha" => 0, "Viktor" => 0, "Sergey" => 0, } );
my %hash2 = ( name1 => {"Sveta" => 0, "Masha" => 0, }, name2 => {"Irina" => 0, }, name3 => {"Sasha" => 0, "Olya" => 0, "Sergey" => 0, }, name8 => {"Valik" => 0, "Garik" => 0, }, );
# Объединяем хеши while ( my($key, $val) = each %hash2 ) { for (keys %{$hash2{$key}}) { if (exists $hash1{$key}{$_}) { ++$hash1{$key}{ucfirst(lc($_))}, } else { $hash1{$key}{ucfirst(lc($_))} = 0; } } }
# Теперь выведем всю структуру в STDOUT и покажем сколько раз пересеклись имена, # а так же сортируем всё сначала по ключам хша %hash1 и по ключам каждого # анонимного хеша, т.е. по именам. foreach my $key ( sort {$a cmp $b} keys %hash1 ) { print "$key\n"; foreach my $name ( sort {$a cmp $b} keys %{$hash1{$key}} ) { print "\t$name => Кол-во пересечений: " . $hash1{$key}{$name} . "\n"; } }
|
На самом деле можно было бы заюзать и анонимные массивы, но тогда бы мы лишились информации о кол-ве пересечений, да и обработка наверняка усложнилась бы, так как приходилось бы проходить по каждому элементу анонимного массива первого хеша и сверять его с каждым елементом анонимного массива второго хеша. Думаю на скорость это тоже повлияло бы.
Модератор: захватывай в теги "код", только код и коментарии, а просто текст пиши за их пределами. Очень не удобно читать, когда текст сообщения написан вперемешку с кодом. |