2017-03-25 7 views
0

にアクセスするための配列のハッシュの要素を使用する:私はこのような配列のハッシュを持っているキー

my @array1 = ("one", "two", "three", "four", "five"); 
my @array2 = ("banana", "pear", "apple"); 

my %hash = (
    numbers => \@array1, 
    fruit => \@array2 
); 

私がキーにアクセスするには、配列の要素を使用したいと思います。たとえば、「バナナ」があれば、「果物」を印刷したいと思います。

しかし、私がprint $hash{banana}を実行したとき、私は「印刷でユニット化された値を使用する」ことを得ました。どうすればこれに正しくアクセスできますか?

my %hash1 = map { $_ => "numbers" } @array1; 
my %hash2 = map { $_ => "fruit" } @array2; 

し、それらを連結します:あなたは二つの異なるハッシュ作成することができ

+0

ハッシュ検索は、配列検索と同様に一方向です。キーを指定すると、対応する値を直接見つけることができますが、キーを見つけるための値を使用しても機能しないので、検索を作成する必要があります。 – Borodin

+0

私は同じ値の複数のキーを持つことができるようにそれを反転する方法はありますか? – orangepeel

+0

ハッシュの値は独立していますが、同じ*値*に設定することもできます。配列内の文字列である8個のキーと値として 'numbers'または' fruit'を使ってハッシュを構築することができます。 – Borodin

答えて

0

すでにコメントでボロディンによって言及

my %hash = (%hash1, %hash2); 
1

を、これを達成するための直接的な方法はありません。しかし、あなたは次のようにそれを行うことができます:

sub getKeyByValue { 
    my ($hashref, $val) = @_; # get sub arguments 
    for (keys %$hashref) { 
     # find key by value and give back the key 
     return $_ if grep $_ eq $val, @{$hashref->{$_}}; 
    } 
    return undef; # value not found 
} 

my $key = getKeyByValue(\%hash, 'banana'); 
print $key; 

出力:fruit

をするだけのサブルーチンgetKeyByValue()にハッシュリファレンスと、ご希望の値を与え、それが対応するキーを返します。値が見つからない場合、サブルーチンは未定義値undefを返します。あなたのデータ構造が本当に大きい場合、この些細な検索は明らかに最も効率的なソリューションではありません。

注:値bananaが複数回(複数のキーの下で)保存されている場合、このサブルーチンは最初のランダムな一致(キー)のみを返します。 bananaが格納されている可能性があるすべてのキーに興味がある場合は、サブルーチンを変更する必要があります。

Perlのほとんどの時間のように、これを行うには多くの方法があります。たとえば、ハッシュを逆にして新しいハッシュを作成できます(perlfaq4の例を参照)。

関連する問題