web-dev-qa-db-ja.com

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

ハッシュがあれば

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

そして、それがハッシュの唯一のキーであることは知っていますが、それが何と呼ばれるのかわかりません。

その後、そのハッシュを反復処理する必要がありますか

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

または、キーの名前を取得するより良い方法はありますか?

28

リストスライス はそれを行うべきです

(keys %h)[0]

keysはリストを返すので、そのリストの最初の要素を抽出するだけです。

40
Marc B
my ($key) = keys %h;

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

14
Oesor

keys関数を使用する必要があるとは思いません。

my ($key) = %h;

または

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

括弧内のハッシュはリストに展開され、そのリストの最初の要素(キー)を取得するだけです。

11
TLP
my @keys = keys %h;
my $key = $keys[0];
6
Colin Fine

[ keys %h ]->[0]は、明確化も行います Joel 以前のコメントでの言及。このコードは問題を引き起こすような匂いがします。実際にキーと値のペアが1つしかない場合は、データを処理するためのより良い方法があるかもしれません。

少なくとも、私は期待が静かに違反されないことを確認します。例えば。-

keys %h == 1 or die "ETOOMANYKEYS";
print [ keys %h ]->[0], $/;
4
Ashley

見てみましょう見てください at

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;

それが私たちが始めたものです。

3
Wolf
my $k = each %h;

ただし、同じハッシュで再度使用する場合は、イテレータをリセットすることを忘れないでください。別のeachが実行するか、keysが実行します。スカラーコンテキストで使用すると、リストの作成が回避されます。だからあなたはそれをリセットすることができます

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

したがって、次のようにすることができます。

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

しかし、JSONメッセージやハッシュの内容を一度だけ読み取って破棄したいものを読み取るようなものだとすると、おそらく最も簡潔です。ただし、変数をすぐに使用する場合は、おそらくこれを行うほうが簡単です。

my ( $k, $v ) = each %$simple_JSON_structure;
2
Axeman