문제

나는 잠시의 문장에서 요소를 배열로 밀고 있습니다. 각 요소는 교사의 이름입니다. 루프가 끝나면 배열에서 교사 이름이 중복됩니다. 때때로 그들은 배열에서 서로 옆에 있지 않으며 때로는 그렇습니다.

완료된 값을 가져온 후 해당 배열의 고유 한 값 만 어떻게 인쇄 할 수 있습니까? 요소를 인쇄 할 때마다 전체 배열을 구문 분석하지 않아도됩니다.

그녀는 모든 것이 배열로 푸시 된 후 코드입니다.

$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
        printf $fh '"'.$faculty[$i].'"';
        $i++;
}   
도움이 되었습니까?

해결책

use List::MoreUtils qw/ uniq /;
my @unique = uniq @faculty;
foreach ( @unique ) {
    print $_, "\n";
}

다른 팁

가장 좋은 방법은 UNIQ와 같은 (기본적으로) 내장 도구를 사용하는 것입니다.Innam에 의해 설명 된대로).

UNIQ를 사용하고 주문을 보존하려는 경우 GREP를 사용하여이를 시뮬레이션 할 수 있습니다.

my %seen;
my @unique = grep { ! $seen{$_}++ } @faculty;
# printing, etc.

이것은 먼저 각 키가 각 항목 인 해시를 제공합니다. 그런 다음 각 요소를 반복하여 몇 가지 요소가 있는지 계산하고 첫 번째 요소를 추가합니다. (Brian D Foy의 의견으로 업데이트)

해시로 밀어 넣는 것이 좋습니다. 이와 같이:

my %faculty_hash = ();
foreach my $facs (@faculty) {
  $faculty_hash{$facs} = 1;
}
my @faculty_unique = keys(%faculty_hash);
@array1 = ("abc", "def", "abc", "def", "abc", "def", "abc", "def", "xyz");

@array1 = grep { ! $seen{ $_ }++ } @array1;

print "@array1\n"; 

이 질문은 Perldoc의 여러 솔루션으로 답변됩니다. 명령 줄에 입력합니다.

perldoc -q duplicate

참고 : 해시가 포함 된 일부 답변은 배열의 순서를 변경합니다. 해시는 어떤 종류의 순서도 없으므로 키나 값을 얻으면 정의되지 않은 순서로 목록을 작성합니다.

이것은 적용되지 않습니다 grep { ! $seen{$_}++ } @faculty

이것은 고유 한 줄이 나타나기 위해 인쇄하는 하나의 라이너 명령입니다.

perl -ne '$seen{$_}++ || print $_' fileWithDuplicateValues

방금 Hackneyed 3 라이너를 발견했습니다

my %uniq; 
undef @uniq(@non_uniq_array); 
my @uniq_array = keys %uniq; 

그것을하는 또 다른 방법은 유용합니다 주문에 관심이없는 경우에만:

my %hash;
@hash{@faculty}=1;
my @unique=keys %hash;

새 변수를 선언하지 않으려면 어떻게 든 문서화 된 글로벌 변수를 사용할 수 있습니다. %_

@_{@faculty}=1;
my @unique=keys %_;

교수진 목록을 어떤 식 으로든 처리 해야하는 경우 키 합병을 위해 해시로 변환 된 배열의 맵이 키를 정렬하는 방법입니다. 또 다른 좋은 방법입니다.

my @deduped = sort keys %{{ map { /.*/? ($_,1):() } @faculty }};
print join("\n", @deduped)."\n";

당신은 변경하여 목록을 처리합니다 /.*/ 그에 따라 선택 또는 구문 분석 및 캡처를위한 재규모로, 패스 당 하나 이상의 돌연변이가 아닌 비 유니 키 키를 출력 할 수 있습니다. ($_,1):() 임의로 복잡합니다.

대체 정규식으로 기내 데이터를 수정 해야하는 경우 이름에서 점을 제거하십시오 (s/\.//g), 그런 다음 위의 패턴에 따른 치환은 원본을 돌연변이합니다. @faculty 그로 인해 배열 $_ 별칭. 당신은 돌아 다닐 수 있습니다 $_ 익명의 사본을 만들어 별명 @faculty 배열 (소위를 참조하십시오 "베이비 카트"운영자):

my @deduped = sort keys %{{ map {/.*/? do{s/\.//g; ($_,1)}:()} @{[ @faculty ]} }};
print join("\n", @deduped)."\n";
print "Unmolested array:\n".join("\n", @faculty)."\n";

보다 최근의 Perl 버전에서는 통과 할 수 있습니다. keys 해시프, 비파괴 대체를 사용할 수 있습니다.

my @deduped = sort keys { map { /.*/? (s/\.//gr,1):() } @faculty };

그렇지 않으면 grep 또는 $seen[$_]++ 다른 곳에서는 용액이 바람직 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top