2014-01-28 72 views
1

例如,如果我的HOL的样子:随着列表的散列,我如何按随机顺序对每个键/列表元素进行操作?

%HoL = ( 
    "flintstones"  => [ "fred", "barney" ], 
    "jetsons"   => [ "george", "jane", "elroy" ], 
    "simpsons"   => [ "homer", "marge", "bart" ], 
); 

我想创建一个循环,这将让我在一个完全随机的顺序在每个键/元素对操作只有一次(这样跳过键之间的键也不只是元素),我该怎么做?我在想它会使用洗牌,但搞清楚具体细节正在击败我。

(对不起,问题noobishness;我还没有被编码久,我也无法找到通过谷歌搜索这一特定问题的答案,但我敢说,它已经在什么地方回答)

+1

取出'keys%HoL'返回的列表,然后使用它的成员来访问这些值。 –

+1

您描述它的方式,我不认为这可行。我可以很容易地将密钥洗牌,然后对每个密钥附加的数组中的值进行洗牌,但是如何获得每个可能的密钥/元素对的随机列表?例如,所得到的k/v集可能看起来像: (k,v) flintstones - > [0],simpsons - > [2],jetsons - > [1],jetsons - > [0 ],simpsons - > [1]等... –

回答

6

建立一个然后洗牌:

use List::Util 'shuffle'; 

my %HoL = (
    "flintstones"  => [ "fred", "barney" ], 
    "jetsons"   => [ "george", "jane", "elroy" ], 
    "simpsons"   => [ "homer", "marge", "bart" ], 
); 

# Build an array of arrayrefs ($ref->[0] is the key and $ref->[1] is the value) 
my @ArrayOfPairs = map { 
    my $key = $_; 
    map { [ $key, $_ ] } @{$HoL{$key}} 
} keys %HoL; 


for my $pair (shuffle @ArrayOfPairs) { 
    print "$pair->[1] $pair->[0]\n"; 
} 
+0

非常感谢。 :)传奇。 –

+0

完美地工作,再次感谢。 –

相关问题