2014-12-10 4 views
1

해시가있는 경우 동일한 수의 키가 들어있는 여러 해시로 나누거나 분할 할 수 있습니까?
기본적으로 배열의 접합은 내가 필요로하는 것 (루프/슬라이스)에 가깝지만 배열에만 적용됩니다. 이렇게하려면 가장 좋은 방법은 무엇입니까?
업데이트 : 배열의 접합을 시뮬레이션 할 수 있도록
또는 방법이해시를 여러 해시로 분할

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

이되고
업데이트를 키 - 값의 대부분의 X 번호로 제거하는

{ 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 : 업데이트보기 – 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

@ 짐 : 나는'지도'밖에서'삭제 '한다. – 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;