Да, это называется:
use List::Util qw<first>;
# Your regex does not compile perhaps you mean /teen$/
my $value = $hash{ ( first { m/teen/ } keys %hash ) || '' };
(То есть перед умным сопоставлением. См. Ответ моба для умного сопоставления.)
Вы также можете отсортировать ключи:
my $value = $hash{ ( first { m/teen/ } sort keys %hash ) || '' };
Я бы заморозил это как "операцию":
use Scalar::Util qw<reftype>;
sub values_for_keys_like (\[%$]$) {
my $ref = reftype( $_[0] ) eq 'HASH' ? $_[0] : $$_[0];
return unless my @keys = keys %$ref;
my $regex = shift;
# allow strings
$regex = qr/$regex/ unless my $typ = ref( $regex );
# allow regex or just plain ol' filter functions.
my $test = $typ eq 'CODE' ? $regex : sub { return unless m/$regex/; 1 };
if ( wantarray ) {
return unless my @k = grep { defined $test->( $_ ) } @keys;
return @$ref{ @k };
}
else {
return unless my $key = first { defined $test->( $_ ) } @keys;
return $ref->{ $key };
}
}
И вы можете использовать это так:
my $key = values_for_keys_like( %hash => qr/teen/ );
Или
my $key = values_for_keys_like( $base->{level_two}{level_three} => qr/teen/ );