2

谁能告诉我如何将数组的重复元素推送到新数组?这就是我到目前为止所拥有的,我想再次将重复的元素保留到一个新的数组中。

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

6 回答 6

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 即可。

于 2012-07-11T07:38:21.480 回答
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

于 2012-07-11T08:39:25.963 回答
3

与您的逻辑相同,但陈述不同。

use strict;
my @ar = (1,2,3,4,1,2);
my %ar = map { $_ ,  1 } @ar ;
my @ar1 = keys %ar;

print @ar1;

还要检查这个

于 2012-07-11T07:35:38.377 回答
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 );
于 2012-07-11T16:29:10.090 回答
2

消除重复很简单:

use List::MoreUtils qw<uniq>;

my @uniq = uniq @list;

获取重复项需要更明确的 Perl:

my %seen;
my @dups = grep { ++$seen{ '' . $_ } == 2 } @list;
于 2012-07-11T12:16:45.863 回答
2

必须始终 在程序开始时声明所有变量use strict在首次使用时使用。在这种情况下,它会向您显示您正在向数组添加数据,但显示.use warningsmy@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";
于 2012-07-11T18:13:27.050 回答