Нет, ты не можешь. Одиночный хеш - неправильный подход для такого поиска.
Если ваши ключи имеют фиксированный размер, например 4 символа в соответствии с вашим примером, вы можете использовать несколько хешей. Вот эскиз алгоритма:
my %first = (
A => { AAAA => 1, ... all keys starting with A... },
...
);
my %second = {
A => { AAAA => 1, ... all keys having A as 2nd character... },
...
);
my %third = ...
my %fourth = ...
# match first (F) and last (D) character in key
my $matches_first = $first{F};
my $matches_last = $fourth{D};
my @matches =
grep { exists $matches_fourth->{$_} }
keys %{ $matches_first };
В реальной программе вы должны сгенерировать содержимое %first
и т. Д. Из списка ключей и вычислить код совпадения из шаблона поиска.
foreach my $c ('A'..'Z') {
$first{$c} = {};
$second{$c} = {};
$third{$c} = {};
$fourth{$c} = {};
}
foreach my $key (keys %identifier) {
my($c1, $c2, $c3, $c4) = split(//, $key);
$first{$c1}->{$key}++;
$second{$c2}->{$key}++;
$third{$c3}->{$key}++;
$fourth($c4}->{$key}++;
}
РЕДАКТИРОВАТЬ 2: В зависимости от объема ваших данных также может быть возможно использовать простую функцию поиска, например, для вашего примера
my @matches = grep { /^F..D$/ } keys %identifier;