有人能告诉我如何将数组的重复元素推送到新数组吗? 这就是我现在所拥有的,我想再次将重复元素保留到一个新数组中。
%seen = ();
@uniq = ();
foreach $item (@list) {
unless ($seen{$item}) {
$seen{$item} = 1;
push(@uniq, $item);
}
}
print "@unique\n";
答案 0 :(得分:6)
始终使用use strict;
和use warnings;
启动您的脚本。
use strict ;
use warnings ;
my @list = ( 1 .. 10 , 2 , 5 , 6 ) ;
my %seen = ();
foreach my $item (@list) {
$seen{$item}++ ;
}
my @uniq = grep { $seen{$_} == 1 } keys %seen ;
my @not_unique = grep { $seen{$_} > 1 } keys %seen ;
只需计算哈希中每个元素的出现次数,然后再使用grep。
答案 1 :(得分:5)
目前还不清楚你想要完成什么...你想删除重复项,还是找到它们?这是以下两者的解决方案:
use strict;
use warnings;
my @list = (1,2,3,4,5,6,1,2,3);
my %unique;
@unique{ @list } = ();
print join(',',sort keys %unique)."\n";
输出:
1,2,3,4,5,6-
use strict;
use warnings;
my @list = (1,2,3,4,5,6,1,2,3);
my %dupes;
%dupes = map { $_ => $dupes{$_}++ } @list;
delete @dupes{ grep { $dupes{$_} == 0 } keys %dupes };
print join(',',sort keys %dupes)."\n";
输出:
1,2,3
答案 2 :(得分:3)
与你的逻辑相同,但不同的陈述。
use strict;
my @ar = (1,2,3,4,1,2);
my %ar = map { $_ , 1 } @ar ;
my @ar1 = keys %ar;
print @ar1;
答案 3 :(得分:3)
如果您要查找多次出现的值:
my @seen;
my @dups = grep ++$seen{$_} == 2, @list;
@list = qw( foo bar baz foo foo moo bar );
gives
@dups = qw( foo bar );
如果您尝试将仅在@uniq
中找到一次的值和在@dups
中找到两次或更多次的值:
my %counts;
++$counts{$_} for @list;
my (@uniq, @dups);
for (@list) {
my $count = $counts{$_};
push @uniq, $_ if $count == 1;
push @dups, $_ if $count == 2;
}
@list = qw( foo bar baz foo foo moo bar );
gives
@uniq = qw( baz moo );
@dups = qw( foo bar );
如果您尝试将值的第一个实例放在@uniq
中,将第二个及后续值放在@dups
中:
my (@uniq, @dups, %seen);
push @{ $seen{$_}++ ? \@dups : \@uniq }, $_ for @list;
@list = qw( foo bar baz foo foo moo bar );
gives
@uniq = qw( foo bar baz moo );
@dups = qw( foo foo bar );
答案 4 :(得分:2)
消除重复就是这么简单:
use List::MoreUtils qw<uniq>;
my @uniq = uniq @list;
获取重复项,需要更明确的Perl:
my %seen;
my @dups = grep { ++$seen{ '' . $_ } == 2 } @list;
答案 5 :(得分:2)
您必须始终在程序开始时 use strict
和use warnings
,并在首次使用时使用my
声明所有变量。在这种情况下,它会向您显示您正在向数组@uniq
添加数据,但显示@unique
的内容。
此程序将打印所有唯一数据项的列表,以及已发生两次或更多次的第二个数据列表
use strict;
use warnings;
my @list = qw/ a a a b b c /;
my %seen;
my @uniq;
my @multiple;
foreach my $item (@list) {
if (not $seen{$item}++) {
push @uniq, $item;
}
elsif ($seen{$item} == 2) {
push @multiple, $item;
}
}
print "Unique: @uniq\n";
print "Multiple: @multiple\n";