-2

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

考虑以下:

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

$hash->{mykey} = @array;

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

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

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

在修复了该疏忽之后,以下解决方案完美运行。

4

2 回答 2

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} }) ];
于 2012-11-13T03:02:09.987 回答
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];
于 2012-11-13T02:16:41.460 回答