仅用一个键在哈希中查找键名?
Posted
技术标签:
【中文标题】仅用一个键在哈希中查找键名?【英文标题】:Find key name in hash with only one key? 【发布时间】:2011-10-25 01:59:07 【问题描述】:如果我有哈希
my %h = (
secret => 1;
);
我知道这只是哈希中的一个键,但我不知道它叫什么。
然后我是否必须遍历该哈希
my $key;
foreach my $i (keys %h)
$key = $h$i;
或者有没有更好的方法来获取密钥的名称?
【问题讨论】:
有一个much easier solution,而不是到目前为止给出的所有答案(包括接受的答案)。它也更短,更容易理解和记住。 【参考方案1】:list slice 应该这样做
(keys %h)[0]
keys
返回一个列表,因此只需提取该列表的第一个元素。
【讨论】:
使用这种方法唯一需要注意的是“看起来像一个函数”的问题。为避免这种情况,您可能需要((keys %h)[0])
,例如perl -E 'my %h = ( secret => 1); say (keys %h)[0];'
失败但perl -E 'my %h = ( secret => 1); say((keys %h)[0]);'
有效。问题是 perl 看到 say
和 ()
并因此解析为 (say(keys %h))[0]
。所以要小心。
没有数组被返回或引用被取消引用。修复了术语并添加了相关文档的链接。
这么棒的答案。拯救了我的一天 :) 非常感谢【参考方案2】:
my ($key) = keys %h;
当您在赋值运算符的两侧使用列表上下文时,键列表中的第一项被分配给 $key。
【讨论】:
【参考方案3】:我认为没有必要使用keys
函数。
my ($key) = %h;
或
my $key = (%h)[0];
parens 中的 hash 会被展开为一个列表,然后我们可以简单地取该列表的第一个元素,也就是 key。
【讨论】:
我同意这行得通。我认为这是给 Perl 一个坏名声的“过于聪明”的一个例子。 那么my ($x) = %h
整体上是不是太聪明了?【参考方案4】:
my @keys = keys %h;
my $key = $keys[0];
【讨论】:
【参考方案5】:[ keys %h ]->[0]
也将消除 Joel 在较早评论中提到的歧义。这段代码闻起来会引起问题。如果真的只有一个键/值对,可能会有更好的方法来处理数据。
至少,我会检查以确保永远不会默默地违反期望。例如‐
keys %h == 1 or die "ETOOMANYKEYS";
print [ keys %h ]->[0], $/;
【讨论】:
【参考方案6】:让我们看看
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;
我们就是这样开始的。
【讨论】:
【参考方案7】: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;
【讨论】:
无效上下文中的键也可以工作(并且对于绑定的哈希会更有效) But don't forget to reset the iterator using keys(%hash) afterwards or subsequent each will fail.以上是关于仅用一个键在哈希中查找键名?的主要内容,如果未能解决你的问题,请参考以下文章