2011-08-11 10 views
21

私はハッシュキーが1つのみのハッシュでキー名を検索しますか?

my %h = (
    secret => 1; 
); 

を持っていると私はそれが唯一知っている場合は、ハッシュ内の1つのキーであるが、私はそれが呼び出されるかわかりません。

は、私は、そのハッシュ

my $key; 
foreach my $i (keys %h) { 
    $key = $h{$i}; 
} 

を反復処理する必要がありますかまたはキーの名前を取得するための良い方法はありますか。

+0

これまでのすべての回答(受け入れられたものを含む)よりはるかに簡単な解決策(http://stackoverflow.com/a/42809337/2932052)があります。また、理解しやすく、覚えやすくなります。 – Wolf

答えて

34

list sliceはそれを

(keys %h)[0] 

keysを行う必要がありますので、ちょうどそのリストの最初の要素を抽出し、リストを返します。

+7

このメソッドに注意する唯一のことは、 "関数のように見える"問題です。これを避けるには、 'perl -E 'my%h =(secret => 1)のように'((keys%h)[0]) 'が必要です。 (キー%h)[0]; 'は失敗しますが、 'perl -E'は%h =(秘密=> 1)です。 say((keys%h)[0]); ''が動作します。問題はperlが 'say'と'() 'を見て、'(keys {h})} [0] 'と解釈するということです。だから注意してください。 –

+4

返される配列や、逆参照される参照はありません。用語を修正し、関連するドキュメントへのリンクを追加しました。 – ikegami

6
my @keys = keys %h; 
my $key = $keys[0]; 
8

keys機能を使用する必要はないと思います。

my ($key) = %h; 

または

my $key = (%h)[0]; 

括弧内のハッシュがリストに展開されます、そして、我々は単に鍵となり、そのリストの最初の要素を取ることができます。

+1

私はこれがうまくいくことに同意します。私はそれがPerlに悪い名前を与える "半分賢明な"例であると思う。 –

+0

あなたはこれが半分ほど賢明だと思いますか? – TLP

+0

'my($ x)=%h'も全体的に賢いですか? –

4

[ keys %h ]->[0]また、曖昧さ回避Joelのコメントは前のコメントに記載されています。このコードは、問題を引き起こすような臭いがあります。実際にキーと値のペアが1つしかない場合は、データを処理するためのより良い方法があるかもしれません。

少なくとも、私は期待が黙って決して侵害されないことを確かめるでしょう。例えば。 ‐

keys %h == 1 or die "ETOOMANYKEYS"; 
print [ keys %h ]->[0], $/; 
2
my $k = each %h; 

しかし、あなたは二度と同じハッシュにそれを使用したい場合は、イテレータをリセットするために覚えておく必要があります。 eachが実行するか、またはkeysが実行され、スカラーコンテキストで使用される場合、リストの作成は行われません。

my $k = (scalar keys %h, each %h); 

をしかし、あなたは一度だけハッシュとスローに何があるか読みたいJSONメッセージやものを読むようにそれを仮定:だから、あなたはこのようにそれを行うことができますので、

scalar keys %h; 
# OR 
each %h;   # <- gets the undef 
my $k2 = each %h; # <- gets the first key 

でそれをリセットすることができますそれはおそらく最も簡潔です。あなたはすぐに変数をしたい場合は、それはおそらくこれを行うには簡単です:

my ($k, $v) = each %$simple_JSON_structure; 
+1

voidコンテキスト内のキーも有効です(結び付けられたハッシュの方が効率的になります)。 – ysth

+0

[キー(%hash)を使用してイテレータをリセットすることを忘れないでください。 co.jp/posts/42809852 /改訂版) – Wolf

12
my ($key) = keys %h; 

あなたが代入演算子の両側にリストコンテキストを使用しているため、キーのリストの最初の項目を取得$ keyに割り当てられます。

1

レッツ・

my ($key) = %h; 

ハッシュや配列を見を持っている彼らは思えるほど異なっていません。どちらもリストに密接に関連しています。リストを使用するのは、通常の方法で初期化され、=>はほとんどの場合,のエイリアスです。唯一の違いは、暗黙のうちにその左のオペランドを引用する点です。以下の両方のラインが受け付けられますのでPerlは、あなたがその右オペランドの引用を忘れてしまった場合にのみ停止します。

my %h = (a=>b=>c=>'d'); 
my @a = (a=>b=>c=>'d'); 

さて、あなたはこれを試してたのですか?

my %h = ('key'); 

...またはこの:

my @a = ('value'); 
my %h = @a; 

上記のハッシュは少し奇妙に見えるかもしれないが、それは価値undefを持つだけのキーです。

それはあなたが単一の値にアクセスする方法を尋ねてきますが最も可能性がありますので、私が使用することをお勧め:

my ($key, $value) = %h; 

...またはさらに簡単:

my ($key) = %h; 

使い始めた何が。

関連する問題