从散列中的数组中获取随机元素

时间:2012-11-13 02:11:33

标签: arrays perl random

我在谷歌上看到了很多关于如何获得随机数组索引的结果,但我无法将其应用于这种情况。

请考虑以下事项:

my %hash;
my @array = {"foo", "bar", "poo"};

$hash->{mykey} = @array;

如何从$ hash-> {mykey}中的数组中获取随机元素?类似下面的代码不起作用:

my $element = $hash->{mykey}[rand($hash->{mykey})];

编辑:所以下面的答案对此非常有用。特别是复杂的我的问题是我使用了线程模块,完全忘了共享我附加到哈希元素的数组!因此,答案对我来说不起作用。

在确定了这种疏忽后,下面的解决方案完美无缺。

2 个答案:

答案 0 :(得分:6)

三个错误。


1。下面创建一个包含一个元素的数组,一个对哈希的引用:

my @array = {"foo", "bar", "poo"};

你肯定打算使用

my @array = ("foo", "bar", "poo");

2

$hash->{mykey} = @array;

相同
$hash->{mykey} = 3;

您无法在标量中存储数组,但可以存储对数组的引用。

$hash->{mykey} = \@array;

3。这将是

rand(@a)    # rand conveniently imposes a scalar context.

表示数组,所以它是

rand(@{ $ref })

用于引用数组。这意味着您需要以下内容:

my $element = $hash->{mykey}[ rand(@{ $hash->{mykey} }) ];

或者你可以把它分成两行。

my $array = $hash->{mykey};
my $element = $array->[ rand(@$array) ];

总之,我们有以下几点:

my @array = ( "foo", "bar", "poo" );
my $hash = { mykey => \@array };

my $element = $hash->{mykey}[ rand(@{ $hash->{mykey} }) ];

答案 1 :(得分:4)

我认为您的第一个问题是构建数据结构:

#always
use strict;
use warnings;

my %hash;
my @array = ("foo", "bar", "poo");

$hash{mykey} = \@array;

您应该阅读perldoc perlreftut以熟悉Perl与嵌套数据结构(引用)相关的语义。

此时您可以一次性创建结构,这可能是您的意思:

#always
use strict;
use warnings;

my %hash = ( 
  mykey => ["foo", "bar", "poo"],
);

要查找长度,您只需使用常规Perl机制来获取数组的长度:

my $length = @{ $hash{mykey} };

然后是随机元素

my $elem = $hash{mykey}[rand $length];