如何在perl中将两个数组中的唯一项和重复项分开?

时间:2016-09-23 03:14:10

标签: arrays perl duplicates unique

我有这个程序,我想我已经关闭,但我无法弄清楚从哪里开始。我已进入循环,我正在尝试从唯一数组中删除重复的数字并将它们输入到重复的数组中。我想我需要使用哈希,但我不确定如何去做。任何帮助将不胜感激。

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 个答案:

答案 0 :(得分: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中。哈希不允许在其中包含多个具有相同名称的键,因此您可以删除重复项。

答案 1 :(得分: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";