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

问题描述 投票:0回答:8

如果我有哈希

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

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

然后我是否必须迭代该哈希

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

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

perl hash
8个回答
44
投票

一个列表切片就可以了

(keys %h)[0]

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


16
投票
my ($key) = keys %h;

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


11
投票

我不认为有必要使用

keys
功能。

my ($key) = %h;

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

括号内的哈希将扩展为一个列表,然后我们可以简单地获取该列表的第一个元素,即键。


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

4
投票

[ keys %h ]->[0]
还将消除歧义,Joel 在之前的评论中提到。这段代码听起来像是会引起问题。如果确实只有一个键/值对,可能有更好的方法来处理数据。

至少,我会检查以确保期望永远不会被默默地违反。例如-

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

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;

这就是我们开始的地方。


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;

0
投票

这对我来说效果很好:

my $text = (keys %result)[0];
© www.soinside.com 2019 - 2024. All rights reserved.