如果我有哈希
my %h = (
secret => 1;
);
我知道这只是哈希中的一个键,但我不知道它叫什么。
然后我是否必须迭代该哈希
my $key;
foreach my $i (keys %h) {
$key = $h{$i};
}
或者有更好的方法来获取密钥的名称吗?
my ($key) = keys %h;
当您在赋值运算符的两侧使用列表上下文时,键列表中的第一项将被分配给 $key。
我不认为有必要使用
keys
功能。
my ($key) = %h;
或
my $key = (%h)[0];
括号内的哈希将扩展为一个列表,然后我们可以简单地获取该列表的第一个元素,即键。
my @keys = keys %h;
my $key = $keys[0];
[ keys %h ]->[0]
还将消除歧义,Joel 在之前的评论中提到。这段代码听起来像是会引起问题。如果确实只有一个键/值对,可能有更好的方法来处理数据。
至少,我会检查以确保期望永远不会被默默地违反。例如-
keys %h == 1 or die "ETOOMANYKEYS";
print [ keys %h ]->[0], $/;
让我们看看
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;
这就是我们开始的地方。
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;
这对我来说效果很好:
my $text = (keys %result)[0];