Автор Тема: Объединение хешей  (Прочитано 5684 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Объединение хешей
« : 24 Марта 2005, 15:35:17 »
Интересно, а нет встроенного в perl решения по объединению хешей или только

Hash::Merge

или


sub merge_hash 
{

    
my (@hashes) = @_;
    
    
my %merge_hash;
    
    foreach 
my $ref (@hashes) {
        while (
my ($key$value) = each %$ref) {
            
next unless $value;
            
$merge_hash{$key} = $value;
        }
    }
    
    return \\%
merge_hash
    
}

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Объединение хешей
« Ответ #1 : 24 Марта 2005, 15:45:55 »
Несколько хешей я всегда объединяю так:

my $h1 = { h1k1 => 1, h1k2 => 2 };
my $h2 = { h2k1 => 3, h2k2 => 4 };

my %h = ( %$h1, %$h2 );


Если их много, можно так:

my @hashes = ($h1, $h2);
%hash = (%hash, %$_) for @hashes;
There Is More Than One Way To Do It (c)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Объединение хешей
« Ответ #2 : 24 Марта 2005, 15:52:59 »
2NetFly а сложные как?
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Объединение хешей
« Ответ #3 : 24 Марта 2005, 15:55:25 »
Phoinix
для простых - руками. для сложных - Hash::Merge.
The documentations is your friend

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Объединение хешей
« Ответ #4 : 24 Марта 2005, 16:23:50 »
2NetFly

Цитировать
my %h = ( %$h1, %$h2 );


Да уж... а я почему-то про космические корабли подумал... ;) пора в отпуск...

Единственно, нужно посмотреть как замещаются повторы ключей

Всем спасибо...

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Объединение хешей
« Ответ #5 : 24 Марта 2005, 16:28:45 »
Цитировать
NeoNox:
а сложные как?

Выше привел второй пример =) Или имеются в виду сложные структуры?
Цитировать
Phoinix:
Единственно, нужно посмотреть как замещаются повторы ключей

В порядке следования хешей. Т.е. $h2 заместит значения одноименных ключей $h1.
There Is More Than One Way To Do It (c)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Объединение хешей
« Ответ #6 : 24 Марта 2005, 16:50:17 »
Цитировать
2NetFly:
Или имеются в виду сложные структуры?

Угу.
my $h1 = { h1k1 => 1, h1k2 => [1, 2, 3, 4] };
my $h2 = { h1k3 => 1, h1k2 => [2, 99, 13] };

my @hashes = ($h1, $h2);
%hash = (%hash, %$_) for @hashes;

print $hash{h1k2}[2];
13
The documentations is your friend

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Объединение хешей
« Ответ #7 : 24 Марта 2005, 18:00:05 »
Цитировать
NeoNox:
print $hash{h1k2}[2];
13

Дык это не баг, а фича =) Одноименные ключи замещаются.
There Is More Than One Way To Do It (c)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Объединение хешей
« Ответ #8 : 24 Марта 2005, 18:17:55 »
Цитировать
2NetFly:
Одноименные ключи замещаются.

Из разных хешей? И где это такое сказано?

use Hash::Merge qw( merge );

my $h1 = { h1k1 => 1, h1k2 => [1, 2, 3, 4] };
my $h2 = { h1k3 => 1, h1k2 => [2, 99, 13] };

my %hash = %{ merge( $h1, $h2 ) };

print $hash{h1k2}[2];

3
The documentations is your friend

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Объединение хешей
« Ответ #9 : 24 Марта 2005, 18:49:31 »
NeoNox

Тут, впрочем, зависит от того какая задача стоит.
Мне наоборот нужно замещение, т.к. мой код именно замещал...

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Объединение хешей
« Ответ #10 : 24 Марта 2005, 18:53:12 »
Я не пойму, насчет чего спор, собственно.


my $h1 
= { h1k1 => 1h1k2 => [1234] };
my $h2 = { h1k3 => 1h1k2 => [29913] };
my %hash = ( %$h1, %$h2 );


Это фактически:

my 
%hash = ( h1k1 => 1h1k2 => [1234], h1k3 => 1h1k2 => [29913] );

И вполне естественно, что более поздний h1k2 => [2, 99, 13]  замещает более ранний h1k2 => [1, 2, 3, 4]. Когда я объединяю хеши я рассчитываю именно на такое поведение, и манипулируя порядком хешей указываю, чей приоритет выше при одинаковых ключах.
There Is More Than One Way To Do It (c)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Объединение хешей
« Ответ #11 : 24 Марта 2005, 19:04:11 »
Цитировать
2NetFly:
Я не пойму, насчет чего спор

Да нету спора. Мне, например, чаще нужно обьединять ключи не теряя значений. Вам, наоборот. Когда возникнет моя задача - вспомните совет нокса (:
The documentations is your friend

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28