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) {
目标:我想检查哈希中的所有条目是否以某种方式相等(这里是计数)。
我讨厌的解决方案:
# 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) {