Forum Webscript.Ru

Программирование => Perl => Тема начата: Phoinix от 24 Марта 2005, 15:35:17

Название: Объединение хешей
Отправлено: Phoinix от 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 от 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;
Название: Объединение хешей
Отправлено: NeoNox от 24 Марта 2005, 15:52:59
2NetFly а сложные как?
Название: Объединение хешей
Отправлено: NeoNox от 24 Марта 2005, 15:55:25
Phoinix
для простых - руками. для сложных - Hash::Merge.
Название: Объединение хешей
Отправлено: Phoinix от 24 Марта 2005, 16:23:50
2NetFly

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


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

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

Всем спасибо...
Название: Объединение хешей
Отправлено: 2NetFly от 24 Марта 2005, 16:28:45
Цитировать
NeoNox:
а сложные как?

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

В порядке следования хешей. Т.е. $h2 заместит значения одноименных ключей $h1.
Название: Объединение хешей
Отправлено: NeoNox от 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
Название: Объединение хешей
Отправлено: 2NetFly от 24 Марта 2005, 18:00:05
Цитировать
NeoNox:
print $hash{h1k2}[2];
13

Дык это не баг, а фича =) Одноименные ключи замещаются.
Название: Объединение хешей
Отправлено: NeoNox от 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
Название: Объединение хешей
Отправлено: Phoinix от 24 Марта 2005, 18:49:31
NeoNox

Тут, впрочем, зависит от того какая задача стоит.
Мне наоборот нужно замещение, т.к. мой код именно замещал...
Название: Объединение хешей
Отправлено: 2NetFly от 24 Марта 2005, 18:53:12
Я не пойму, насчет чего спор, собственно.


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


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

my %hash = ( h1k1 => 1, h1k2 => [1, 2, 3, 4], h1k3 => 1, h1k2 => [2, 99, 13] );
И вполне естественно, что более поздний h1k2 => [2, 99, 13]  замещает более ранний h1k2 => [1, 2, 3, 4]. Когда я объединяю хеши я рассчитываю именно на такое поведение, и манипулируя порядком хешей указываю, чей приоритет выше при одинаковых ключах.
Название: Объединение хешей
Отправлено: NeoNox от 24 Марта 2005, 19:04:11
Цитировать
2NetFly:
Я не пойму, насчет чего спор

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