Perl:如果所有条目都相等,则检查散列,从散列中获取 arbitrary/random 键

Perl: check in hash if all entries are equal, get an arbitrary/random key from hash

目标:我想检查哈希中的所有条目是否以某种方式相等(这里是计数)。

我讨厌的解决方案:

# initialize some fake data
my @list1 = (2, 3);
my @list2 = (1, 2);
my %hash = (12 => \@list1, 22 => \@list2);
# here starts the quest for the key
my $key;
foreach my $a (keys %hash) {
  $key = $a;
}
# some $key is set
# here starts the actual comparision
my $count = scalar(@{%hash{$key}});
foreach my $arr_ref (%hash) {
  my $actcount = scalar(@$arr_ref);
  print "some warning" if $actcount != $count;
}

我知道我也可以在循环的第一次迭代中存储大小,这样我就不需要提前获取密钥了。但它会在每次迭代中给我一个条件语句。所以我想避免它。

问题: 从哈希中获取密钥的正确方法是什么?

加法: 应该有可能像 (键 %hash)[0]

my $key = (keys %hash)[0] 应该有效,或者您可以通过将分配给的标量括在括号中来强制列表上下文:

my ($key) = keys %hash;

另一种方法是在标量上下文中使用 each

my $key = each %hash;

在测试循环中,您只对值感兴趣,因此也不要遍历键:

for my $arr_ref (values %hash) {