Как отфильтровать или сохранить дубликаты в Perl? - PullRequest
2 голосов
/ 07 мая 2010

У меня есть одна текстовая строка, в которой есть несколько повторяющихся символов (FFGGHHJKL). Их можно сделать уникальными с помощью позитивного взгляда:

$ perl -pe 's/(.)(?=.*?\1)//g']

Например, при "FFEEDDCCGG" вывод будет "FEDCG".

У меня вопрос, как заставить его работать с числами (напр. 212 212 43 43 5689 6689 5689 71 81 === вывод должен быть 212 43 5689 6689 71 81)? Также, если мы хотим, чтобы в качестве выходных данных из файла, содержащего n строк, были заданы только дубликаты записей

212 212 43 43 5689 6689 5689 71 81
66 66 67 68 69 69 69 71 71 52
..

Выход:

212 212 43 43 5689 5689
66 66 69 69 69 71 71

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 07 мая 2010

Следующие данные не проверены, но должны распечатывать только дубликаты.

my $line = "212 212 43 43 5689 6689 5689 71 81\n";
chomp $line;

my %seen;
my @order;
foreach my $elem (split /\s+/, $line) {
  ++$seen{$elem};
  push @order, $elem if $seen{$elem} == 2;
}

foreach my $elem (@order) {
  print "$elem " x $seen{$elem};
}
print "\n";

Теперь для удаления дубликатов вы можете:

print "$_ " for keys %seen;

НО, который не сохраняет порядок,Вы можете сделать что-то подобное, как я сделал для распечатки только дупликов.Или используйте такой модуль как Tie :: Hash :: Indexed (спасибо, daxim) или Tie :: IxHash

0 голосов
/ 07 мая 2010

Для первой части

$ cat prog.pl
#! /usr/bin/perl -lp

my %seen;
$_ = join " " => map $seen{$_}++ ? () : $_ => split;

$ echo 212 212 43 43 5689 6689 5689 71 81 | ./prog.pl
212 43 5689 6689 71 81

Для второй части

$ cat prog.pl
#! /usr/bin/perl -lp

my %dups;
my @nums = split;
++$dups{$_} for @nums;

$_ = join " " => grep $dups{$_} > 1 => @nums;

$ cat input
212 212 43 43 5689 6689 5689 71 81
66 66 67 68 69 69 69 71 71 52

$ ./prog.pl input
212 212 43 43 5689 5689
66 66 69 69 69 71 71
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...