如果我有哈希
my %h = (
secret => 1;
);
我知道这只是哈希中的一个键,但我不知道它叫什么。
然后我必须遍历该哈希
my $key;
foreach my $i (keys %h) {
$key = $h{$i};
}
或者有更好的方法来获取密钥的名称吗?
答案 0 :(得分:40)
答案 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;