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