仅用一个键在哈希中查找键名?

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.

以上是关于仅用一个键在哈希中查找键名?的主要内容,如果未能解决你的问题,请参考以下文章

项目中阶梯费率解决方法,数组中通过键名查找键值

哈希表建立及冲突处理

如何只计算字典中的单词,同时返回字典键名的计数

在 iOS 中为 AVAsset 检索 AVMetadataItem 上的键名

PHP函数

PHP 根据配置转换数组中的键名 方便给前端的时候改键名