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

时间:2011-08-11 14:58:43

标签: perl hash

如果我有哈希

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

我知道这只是哈希中的一个键,但我不知道它叫什么。

然后我必须遍历该哈希

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

或者有更好的方法来获取密钥的名称吗?

7 个答案:

答案 0 :(得分:40)

list slice应该这样做

(keys %h)[0]

keys返回一个列表,因此只需提取该列表的第一个元素。

答案 1 :(得分:14)

my ($key) = keys %h;

当您在赋值运算符的两侧使用列表上下文时,键列表中的第一项将分配给$ key。

答案 2 :(得分:10)

我认为没有必要使用keys函数。

my ($key) = %h;

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

parens中的哈希将被扩展为一个列表,然后我们可以简单地获取该列表的第一个元素,这是关键。

答案 3 :(得分:6)

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

答案 4 :(得分:4)

[ keys %h ]->[0]也会在之前的评论中提及歧义Joel。这段代码闻起来会引起问题。如果实际上只有一个键/值对,则可能有更好的方法来处理数据。

至少,我会检查以确保期望永远不会被默默地侵犯。 E.g .-

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

答案 5 :(得分:3)

看看

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;

这就是我们的开始。

答案 6 :(得分:2)

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;