谁能告诉我如何将数组的重复元素推送到新数组?这就是我到目前为止所拥有的,我想再次将重复的元素保留到一个新的数组中。
%seen = ();
@uniq = ();
foreach $item (@list) {
unless ($seen{$item}) {
$seen{$item} = 1;
push(@uniq, $item);
}
}
print "@unique\n";
谁能告诉我如何将数组的重复元素推送到新数组?这就是我到目前为止所拥有的,我想再次将重复的元素保留到一个新的数组中。
%seen = ();
@uniq = ();
foreach $item (@list) {
unless ($seen{$item}) {
$seen{$item} = 1;
push(@uniq, $item);
}
}
print "@unique\n";
始终以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 即可。
目前尚不清楚您要完成什么...您要删除重复项还是找到它们?以下是两者的解决方案:
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
与您的逻辑相同,但陈述不同。
use strict;
my @ar = (1,2,3,4,1,2);
my %ar = map { $_ , 1 } @ar ;
my @ar1 = keys %ar;
print @ar1;
如果您要查找多次出现的值:
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 );
消除重复很简单:
use List::MoreUtils qw<uniq>;
my @uniq = uniq @list;
获取重复项需要更明确的 Perl:
my %seen;
my @dups = grep { ++$seen{ '' . $_ } == 2 } @list;
您必须始终 在程序开始时声明所有变量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";