Forum Webscript.Ru
Программирование => Perl => Тема начата: 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
}
-
Несколько хешей я всегда объединяю так:
my $h1 = { h1k1 => 1, h1k2 => 2 };
my $h2 = { h2k1 => 3, h2k2 => 4 };
my %h = ( %$h1, %$h2 );
Если их много, можно так:
my @hashes = ($h1, $h2);
%hash = (%hash, %$_) for @hashes;
-
2NetFly а сложные как?
-
Phoinix
для простых - руками. для сложных - Hash::Merge.
-
2NetFly
my %h = ( %$h1, %$h2 );
Да уж... а я почему-то про космические корабли подумал... ;) пора в отпуск...
Единственно, нужно посмотреть как замещаются повторы ключей
Всем спасибо...
-
NeoNox:
а сложные как?
Выше привел второй пример =) Или имеются в виду сложные структуры?
Phoinix:
Единственно, нужно посмотреть как замещаются повторы ключей
В порядке следования хешей. Т.е. $h2 заместит значения одноименных ключей $h1.
-
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
-
NeoNox:
print $hash{h1k2}[2];
13
Дык это не баг, а фича =) Одноименные ключи замещаются.
-
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
-
NeoNox
Тут, впрочем, зависит от того какая задача стоит.
Мне наоборот нужно замещение, т.к. мой код именно замещал...
-
Я не пойму, насчет чего спор, собственно.
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]. Когда я объединяю хеши я рассчитываю именно на такое поведение, и манипулируя порядком хешей указываю, чей приоритет выше при одинаковых ключах.
-
2NetFly:
Я не пойму, насчет чего спор
Да нету спора. Мне, например, чаще нужно обьединять ключи не теряя значений. Вам, наоборот. Когда возникнет моя задача - вспомните совет нокса (: