如何将数组的重复元素推送到新的数组perl

时间:2012-07-11 07:29:04

标签: perl

有人能告诉我如何将数组的重复元素推送到新数组吗? 这就是我现在所拥有的,我想再次将重复元素保留到一个新数组中。

%seen = ();
@uniq = ();
foreach $item (@list) {
    unless ($seen{$item}) {
        $seen{$item} = 1;
        push(@uniq, $item);
    }
}
print "@unique\n";

6 个答案:

答案 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;

Also check this

答案 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 strictuse 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";