2014-03-27 2 views
1
my %aggrs_by_node = (
    node1 => ['a1_1','a1_2'], 
    node2 => ['a2_1','a2_2','a2_3'], 
    hello => ['ah_1','ah_2','ah_3'], 
    node3 => ['a3_1','a3_2','a3_3','a3_4'], 
); 

hello 키를 피하면서이 해시의 모든 배열 요소를 어떻게 라운드 로빈 할 수 있는지 제안 할 사람이 있습니까?Perl - 배열의 해시를 통한 라운드 로빈

Iteration 1 = a1_1 
Iteration 2 = a2_1 
Iteration 3 = a3_1 
Iteration 4 = a1_2 
Iteration 5 = a2_2 
Iteration 6 = a3_2 
Iteration 7 = a1_1 
Iteration 8 = a2_3 

등 ...

답변

6

이 짧은 프로그램은 당신이 무엇을 물어 않습니다. 각 배열에 인덱스의 해시를 유지합니다.

배열 @keys에서 해시 키의 개별 정렬 된 목록을 사용했습니다. 해시에서 직접 가져 오는 것이 예측할 수없는 순서가되고 특정 순서로 출력해야하는 것처럼 보입니다.

use strict; 
use warnings; 

my %aggrs_by_node = (
    node1 => ['a1_1','a1_2'], 
    node2 => ['a2_1','a2_2','a2_3'], 
    hello => ['ah_1','ah_2','ah_3'], 
    node3 => ['a3_1','a3_2','a3_3','a3_4'], 
); 

my %indices = map { $_ => 0 } keys %aggrs_by_node; 
delete $indices{hello}; 
my @keys = sort keys %indices; 

for my $iter (1 .. 20) { 
    my $key = $keys[($iter - 1) % @keys]; 
    my $val = $aggrs_by_node{$key}[$indices{$key}]; 
    $indices{$key} = ($indices{$key} + 1) % @{ $aggrs_by_node{$key} }; 
    printf "Iteration %d = %s\n", $iter, $val; 
} 

출력

Iteration 1 = a1_1 
Iteration 2 = a2_1 
Iteration 3 = a3_1 
Iteration 4 = a1_2 
Iteration 5 = a2_2 
Iteration 6 = a3_2 
Iteration 7 = a1_1 
Iteration 8 = a2_3 
Iteration 9 = a3_3 
Iteration 10 = a1_2 
Iteration 11 = a2_1 
Iteration 12 = a3_4 
Iteration 13 = a1_1 
Iteration 14 = a2_2 
Iteration 15 = a3_1 
Iteration 16 = a1_2 
Iteration 17 = a2_3 
Iteration 18 = a3_2 
Iteration 19 = a1_1 
Iteration 20 = a2_1 
관련 문제