2011-10-29 10 views
-2

ハッシュへの参照を返すサブルーチンがあります。私はそのハッシュから最初のキーを取得し、サブルーチンが返った後に変数に代入したいと考えています。今、私はこれをやっているし、これは動作しますが、私は賢く/簡単な方法ハッシュから変数へのキーの割り当て

my $hash = get_value(); # calling my subroutine here which returns a reference to a hash 
foreach my $keys (keys %{$hash}) { 
    my $test_variable = $keys; # Assigning the first key to variable 
    # check if variable is not empty and exit the loop 
    if (!$test_variable) { 
     last; 
    } 
} 
+10

**ハッシュは順序で要素を保存しないでください。**注文が必要な場合は、配列を使用します。順序付きハッシュが本当に必要な場合は、 'Tie :: IxHash'モジュールを見てください。 –

+1

正しい。 「最初の鍵」はありません。 –

答えて

1

あなたが必要とするすべては次のとおりです。

my($test_variable) = keys %$hash; 
+0

そのハッシュで1つ以上のキーを取得し、私が気にするのは、test_variableに入る最初のキーです。 – user238021

+0

この場合、 '$ test_variable'は最初の要素を取るだけで、それ以外はすべて削除されます。 – drnewman

+1

Perlはリストをリストに割り当てることについて柔軟でスマートです。 '$ test_variable'のかっこは、スカラではなく左辺を1要素のリストにします。リストの割り当てのために左側よりも多くの要素が左側にある場合、Perlはそのエクストラを無視します。同様に、より多くの要素が右側よりもある場合、Perlは残りを 'undef'に設定します。 –

2
my $test_variable = (keys %{get_value()})[0]; 

が内側からそこに作業するべきだと思います。それは周りのget_value()ハッシュリファレンスを返すので、%{}それをハッシュにデリファレンスすると、キーは配列としてキーを返し、()[0]はその配列から0番目の項目を取得します。

しかし、リストにハッシュを回すので、/配列はあなたのキー、値の順にアイテムを与え、これはあまりにも動作します:

my $test_variable = (%{get_value()})[0]; 
3

も注意してください、他の答えはになりますが、は最初のキーを与えます。Perlはハッシュ要素の順序を保証しません。特定の注文が必要な場合は、別のキーのリストを保持し、これを使用して「最初の」要素にアクセスします。

例えば:

my @fields = qw(a b c); 

my $test_variable = get_value()->{$fields[0]}; 
0
my $hash = get_value(); 
keys %$hash; 
my $test_variable = each %$hash; 
keys %$hash; 

ボイドコンテキストキーがハッシュの内部イテレータをリセットします。スカラーコンテキストではそれぞれ次のキーを返します。

関連する問題