2014-12-10 4 views
1

Если у меня есть хэш, как я могу «разбить» его/«разбить» его на несколько хэшей, содержащих равное количество ключей?
В принципе сращивание в массивах, похоже, близко к тому, что мне нужно (loop/slice), но это работает только для массивов. Так что лучший способ сделать это?
Update:
Или способ удалить не более X числа ключевых значений таким образом, чтобы имитировать сращивания массивов
ОбновлениеРазделить хэш на многие хэши

{ foo => 1, bar => 2, bla =>3} 

Чтобы быть

{ foo => 1 }, { bar => 2 }, { bla => 3 } if X = 1 
or { foo => 1, bar => 2 }, { bla => 3 }  if X = 2 
or { foo => 1, bar => 2, bla => 3 }   if X = 3 
+1

Можете ли вы привести пример? – choroba

+0

@choroba: см. Update – Jim

ответ

2

Это должно делать то, что вы хотите. На 5.20+ вы, вероятно, можете использовать новый синтаксис среза для упрощения кода.

#!/usr/bin/perl 
use warnings; 
use strict; 
use Data::Dumper; 

sub split_hash { 
    my ($x, $hash) = @_; 
    my @hashes; 
    while (%$hash) { 
     my @k = keys %$hash; 
     push @hashes, { map each %$hash, 1 .. $x }; 
     delete @{ $hash }{ keys %{ $hashes[-1] } }; 
    } 
    return @hashes 
} 

print Dumper([ split_hash($_, { foo => 1, 
           bar => 2, 
           bla => 3, 
           } 
      )]) for 1 .. 3; 

Обратите внимание, что как написано, код удаляет исходный хэш.

+0

Можно ли зациклировать хэш и удалить элементы в цикле? Я думал, что это неправильно – Jim

+0

@Jim: Я 'удаляю' за пределами' map'. – choroba

+0

Да, но внутри 'while' – Jim

1

Аналогично решению представленной @choroba, но с использованием сращивания, и не изменяет переданный хеш:

use Data::Dumper; 

use strict; 
use warnings; 

sub split_hash { 

    my ($x, $hash) = @_; 

    my @keys = keys %$hash; 
    my @hashes; 

    while (my @subset = splice(@keys, 0, $x)) { 

     push @hashes, { map { $_ => $hash->{$_} } @subset }; 

    } 

    return \@hashes; 
} 


print Dumper([ 
     split_hash(
      $_, 
      { 
       foo => 1, 
       bar => 2, 
       bla => 3, 
      }) ]) for 1 .. 3; 
Смежные вопросы