2016-09-23 2 views
1

У меня есть эта программа, и я думаю, что я рядом, но я не могу понять, куда идти отсюда. Я вошел в цикл, где в настоящее время я пытаюсь избавиться от повторяющихся чисел из уникального массива и ввести их в дублирующий массив. Я думаю, мне нужно использовать хэш, но я не уверен, как это сделать. Любая помощь будет оценена по достоинству.Как отделить уникальные и повторяющиеся элементы от двух массивов в perl?

while ($second != -1){ 
    $second = <STDIN>; 
    chomp $second; 
    @second[$j] = $second; 
    @unique[$j+$i-1] = $second; 
    while($x<10){ 
     if($second == @unique[$x]){ 
      @duplicate[$x]=$second; 
      pop @unique; 
     } 
     $x++; 
    } 
    $x=0; 
    $j++; 
} 
pop @second; 
pop @unique; 

ответ

2

Это должно сделать работу:

use strict; 
use warnings; 

my @original = qw/foo bar hello world foo bar f00 bar barr/; # = array with input data 
my %uniques; 
my @dupes = grep $uniques{$_}++, @original; 

print "unique: "; 
print join ', ', keys %uniques; # output unique elements 

print "\nduplicate: "; 
print join ', ', @dupes; # output duplicate elements 

Выход:

unique: foo, barr, hello, f00, world, bar 
duplicate: foo, bar , bar 

Объяснение:

С grep вы смотрите на каждый элемент массива в @original. Каждый элемент (временно помещенный в $_) вставлен в хэш-код %uniques в качестве ключа. Хэш не позволяет иметь в нем несколько ключей с тем же именем, поэтому вы избавляетесь от дубликатов.

0

Ниже программа будет перебирать более @original и будет создавать два новых массива, каждый из которых будет уникальным и дублировать соответственно. Дубликат будет содержать элемент n раз, если его повторение n раз в массиве.

use strict; 
use warnings; 

my @original = qw/foo bar hello world foo bar f00 bar barr/; # = array with input data 

my %hash =(); 
map {$hash{$_}++} @original; 
my (@uniques, @duplicates) = ((),()); 
for my $key (keys %hash) { 
    if ($hash{$key} == 1) { 
     push (@uniques, $key); 
    } else { 
     push (@duplicates, $key) for (1..$hash{$key}); 
    } 
} 
print "@uniques\n"; 
print "=============\n"; 
print "@duplicates\n";