Perl에 배열이 있습니다.
my @my_array = ("one","two","three","two","three");
배열에서 중복을 제거하려면 어떻게합니까?
답변
perlfaq4에 설명 된대로 다음과 같은 작업을 수행 할 수 있습니다 .
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
my @array = qw(one two three two three);
my @filtered = uniq(@array);
print "@filtered\n";
출력 :
one two three
당신이 모듈을 사용하려면 시도 uniq
에서 기능을List::MoreUtils
답변
Perl 문서에는 멋진 FAQ 모음이 포함되어 있습니다. 자주 묻는 질문 :
% perldoc -q duplicate
위 명령의 출력에서 복사하여 붙여 넣은 답변은 다음과 같습니다.
/usr/local/lib/perl5/5.10.0/pods/perlfaq4.pod에 있습니다. 목록이나 배열에서 중복 요소를 제거하려면 어떻게해야합니까? (brian d foy 제공) 해시를 사용하십시오. "고유 한"또는 "중복 된"이라는 단어를 생각할 때 "해시 키". 요소의 순서에 신경 쓰지 않으면 그냥 할 수 있습니다. 해시를 만든 다음 키를 추출하십시오. 당신이 어떻게 중요하지 않습니다 해시 만들기 : "키"를 사용하여 고유 한 요소를 가져 오면됩니다. 내 % hash = map {$ _, 1} @array; # 또는 해시 슬라이스 : @hash {@array} = (); # 또는 foreach : $ hash {$ _} = 1 foreach (@array); 내 @unique = 키 % hash; 모듈을 사용하려면 "uniq"기능을 사용해보십시오. "List :: MoreUtils". 목록 컨텍스트에서 고유 한 요소를 반환합니다. 목록에서 순서를 유지합니다. 스칼라 컨텍스트에서 고유 한 요소 수 List :: MoreUtils 사용 qw (uniq); 내 @ 고유 = uniq (1, 2, 3, 4, 4, 5, 6, 5, 7); # 1,2,3,4,5,6,7 내 $ unique = uniq (1, 2, 3, 4, 4, 5, 6, 5, 7); # 7 또한 각 요소를 살펴보고 본 요소를 건너 뛸 수 있습니다 전에. 해시를 사용하여 추적하십시오. 루프가 처음으로 % Seen에는 해당 요소가 없습니다. "다음"문은 키는 즉시 "undef"라는 값을 사용하므로 루프 "푸시"로 계속 진행하여 해당 키의 값을 증가시킵니다. 다음 루프가 동일한 요소를 볼 때 그 키는 해시에 존재합니다. 해당 키의 값은 0이거나 "unef"가 아니기 때문에 true이므로 next는 해당 반복을 건너 뛰고 루프는 다음 요소로 이동합니다. 내 @ 고유 = (); 내 % seen = (); 내 $ elem을 @each (@array) { 다음에 $ seen {$ elem} ++; @unique, $ elem을 밀어; } grep을 사용하여 더 짧게 작성할 수 있습니다. 알맞은 것. 내 % seen = (); 내 @ 고유 = grep {! $ seen {$ _} ++} @array;
답변
CPAN의 설치 목록 :: MoreUtils
그런 다음 코드에서 :
use strict;
use warnings;
use List::MoreUtils qw(uniq);
my @dup_list = qw(1 1 1 2 3 4 4);
my @uniq_list = uniq(@dup_list);
답변
이 작업을 수행하는 일반적인 방법은 다음과 같습니다.
my %unique = ();
foreach my $item (@myarray)
{
$unique{$item} ++;
}
my @myuniquearray = keys %unique;
해시를 사용하고 항목을 해시에 추가하는 경우. 또한 각 항목이 목록에 나타나는 횟수를 아는 보너스도 있습니다.
답변
변수 @array는 중복 요소가있는 목록입니다.
%seen=();
@unique = grep { ! $seen{$_} ++ } @array;
답변
간단한 펄 원 라이너로 할 수 있습니다.
my @in=qw(1 3 4 6 2 4 3 2 6 3 2 3 4 4 3 2 5 5 32 3); #Sample data
my @out=keys %{{ map{$_=>1}@in}}; # Perform PFM
print join ' ', sort{$a<=>$b} @out;# Print data back out sorted and in order.
PFM 블록은 다음을 수행합니다.
@in의 데이터는 MAP에 제공됩니다. MAP는 익명의 해시를 만듭니다. 해시에서 키를 추출하여 @out으로 피드
답변
마지막 하나는 꽤 좋았습니다. 방금 약간 조정했습니다.
my @arr;
my @uniqarr;
foreach my $var ( @arr ){
if ( ! grep( /$var/, @uniqarr ) ){
push( @uniqarr, $var );
}
}
아마도 이것이 가장 읽기 쉬운 방법이라고 생각합니다.