Получить общую ссылку на хэш в Perl

#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 %$_ возвращает список ключей. В любом случае, первым элементом списка будет ключ.