Как мне сохранить дублирующее значение из массива или хеша в Perl? - PullRequest
0 голосов
/ 01 ноября 2008

Давайте сделаем это очень легко. Что я хочу:

@array = qw/one two one/;
my @duplicates = duplicate(@array);
print "@duplicates"; # This should now print 'one'.

Как напечатать дубликаты значений массива / хэша?

Ответы [ 6 ]

8 голосов
/ 01 ноября 2008
sub duplicate {
    my @args = @_;
    my %items;
    for my $element(@args) {
        $items{$element}++;
    }
    return grep {$items{$_} > 1} keys %items;
}
2 голосов
/ 01 ноября 2008
# assumes inputs can be hash keys
@a = (1, 2, 3, 3, 4, 4, 5);

# keep count for each unique input
%h = ();
map { $h{$_}++  } @a;

# duplicate inputs have count > 1
@dupes = grep { $h{$_} > 1 } keys %h;

# should print 3, 4
print join(", ", sort @dupes), "\n";
2 голосов
/ 01 ноября 2008

Дополнительная многословная, более читаемая версия того, что вы хотите сделать:

<code>
sub duplicate {
   my %value_hash;
   foreach my $val (@_) {
     $value_hash{$val} +=1;
   }
   my @arr;
   while (my ($val, $num) = each(%value_hash)) {
     if ($num > 1) {
        push(@arr, $val)
     }
   }
  return @arr;
}

Это может быть значительно сокращено, но я намеренно оставил его подробным, чтобы вы могли следовать за ним.

Я не проверял, хотя, так что следите за моими опечатками.

0 голосов
/ 02 ноября 2008

В вопросе не указан порядок, в котором должны быть возвращены дубликаты.

Я могу думать о нескольких возможностях: все равно; по порядку первого / второго / последнего вхождения в списке ввода; отсортированный.

0 голосов
/ 02 ноября 2008

Я собираюсь в гольф!

sub duplicate {
    my %count;
    grep $count{$_}++, @_;
}

@array = qw/one two one/;
my @duplicates = duplicate(@array);
print "@duplicates"; # This should now print 'one'.

# or if returning *exactly* 1 occurrence of each duplicated item is important
sub duplicate {
    my %count;
    grep ++$count{$_} == 2, @_;
}
0 голосов
/ 01 ноября 2008

Используйте словарь, поместите значение в ключ и количество в значение.

Ах, только что заметил, что вы пометили как Perl

while ([...]) {
 $hash{[dbvalue]}++
}
...