#perl #hash #grep
#perl #хэш #grep
Вопрос:
У меня есть хэш, подобный этому.
my $records = {
'Name' => [
{ A => 101},
{ B => 102},
{ B => 102},
{ C => 104},
{ C => 104},
],
};
Теперь я хочу получить хэш-ссылки, которые повторяются, как B => 102 повторяется, я хочу получить то остальное, что я хочу оставить.
Я хочу получить все повторяющиеся ссылки на хэш. В окончательном ответе .
Ответ, который я хочу, такой :
$records = {
'Name' => [
{ B => 102},
{ C => 104},
],
};
Ответ №1:
Предполагая, что хэши с повторяющимися ключами имеют только одну пару ключ / значение,
my $records = {
'Name' => [
{ A => 101},
{ B => 102},
{ B => 102},
{ C => 104},
{ C => 104},
],
};
my %seen;
@{ $records->{Name} } = grep {
my ($k) = keys %$_;
# approve only keys which are seen second time,
# as this qualifies them as duplicates
$seen{$k} ==2
}
@{ $records->{Name} };
Комментарии:
1. я хочу обработать это, если существует значение более одного раза
2. если ключи такие { B => 102},{ B => 102}, { B => 102}, то, я надеюсь, это не сработает
3. если вы можете, пожалуйста, подробнее рассказать об этом, я буду вам благодарен. Я всего лишь новичок в perl
4. @GauravPandey
$_
внутри grep — это ссылка на хэш (т.Е.{ A => 101}
). $k равноA
then, а %просмотренного хэша проверяет, виден лиA
ключ во второй раз. В зависимости от этого он фильтрует хэш или нет.5. @PerlDeveloper
%$_
возвращает единый список пар ключ / значение иkeys %$_
возвращает список ключей. В любом случае, первым элементом списка будет ключ.