-2

ランダム配列インデックスを取得する方法についてグーグルで多くの結果を見てきましたが、このシナリオに適用することはできませんでした。

次のことを考慮してください。

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

$hash->{mykey} = @array;

$ hash-> {mykey}内の配列からランダムな要素を取得するにはどうすればよいですか?動作しない次のコードのようなもの:

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

編集:したがって、以下の回答はこれについて非常に有益です。特に私の問題を悪化させているのは、スレッドモジュールを使用していて、ハッシュ要素に追加していた配列を共有するのを完全に忘れていたことです。このため、答えはすぐには機能しませんでした。

その見落としを修正した後、以下のソリューションは完全に機能しました。

4

2 に答える 2

6

3 つのエラー。


1. 以下は、ハッシュへの参照である 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} }) ];

または、2 行に分割することもできます。

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;

ネストされたデータ構造 (参照) に関連する Perl のセマンティクスに慣れるには、おそらくperldoc perlreftutを読む必要があります。

この時点で、構造を一度に作成できます。これは、おそらくあなたが意味するものです。

#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 に答える