我在谷歌上看到了很多关于如何获得随机数组索引的结果,但我无法将其应用于这种情况。
请考虑以下事项:
my %hash;
my @array = {"foo", "bar", "poo"};
$hash->{mykey} = @array;
如何从$ hash-> {mykey}中的数组中获取随机元素?类似下面的代码不起作用:
my $element = $hash->{mykey}[rand($hash->{mykey})];
编辑:所以下面的答案对此非常有用。特别是复杂的我的问题是我使用了线程模块,完全忘了共享我附加到哈希元素的数组!因此,答案对我来说不起作用。
在确定了这种疏忽后,下面的解决方案完美无缺。
答案 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];