Альтернативный подход к проблеме - это сделать функцию утилиты, которая будет сравнивать все ключи, если одинаковое значение, возвращаемое некоторой функцией для всех клавиш:
sub AllSame (&\%) {
my ($c, $h) = @_;
my @k = keys %$h;
my $ref;
$ref = $c->() for $h->{shift @k};
$ref ne $c->() and return for @$h{@k};
return 1
}
print "OK\n" if AllSame {$_->{Value}} %{$Table{$key1}{$key2}};
Но если вы начнете думать таким образом, вы можете найти этоподход гораздо более общий ( рекомендуемый способ ):
sub AllSame (@) {
my $ref = shift;
$ref ne $_ and return for @_;
return 1
}
print "OK\n" if AllSame map {$_->{Value}} values %{$Table{$key1}{$key2}};
Если операция отображения стоит дорого, вы можете сделать ленивый аналог того же:
sub AllSameMap (&@) {
my $c = shift;
my $ref;
$ref = $c->() for shift;
$ref ne $c->() and return for @_;
return 1
}
print "OK\n" if AllSameMap {$_->{Value}} values %{$Table{$key1}{$key2}};
Если вы хотите тольконекоторые подмножества ключей, которые вы можете использовать синтаксис среза хеша, например:
print "OK\n" if AllSame map {$_->{Value}} @{$Table{$key1}{$key2}}{map "K$_", 1..10};