Saya memiliki sebuah array di Perl:
my @my_array = ("one","two","three","two","three");
Bagaimana cara menghapus duplikat dari array?
Anda dapat melakukan sesuatu seperti ini seperti yang ditunjukkan dalam perlfaq4:
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
my @array = qw(one two three two three);
my @filtered = uniq(@array);
print "@filtered\n";
Output:
one two three
Jika anda ingin menggunakan modul, mencoba uniq
fungsi dari klik disini::MoreUtils
Perl dokumentasi yang datang dengan koleksi yang bagus Faq. Pertanyaan ini sering diajukan:
% perldoc -q duplicate
Jawabannya, copy dan paste dari output perintah di atas, muncul di bawah ini:
Ditemukan di /usr/local/lib/perl5/5.10.0/polong/perlfaq4.pod Bagaimana saya bisa menghapus duplikat elemen-elemen dari suatu list atau array? (kontribusi oleh brian d foy)Gunakan hash. Ketika anda memikirkan kata-kata "unik" atau "diduplikasi", berpikir "hash tombol".
Jika anda don't peduli tentang urutan unsur-unsur, anda hanya bisa membuat hash kemudian ekstrak tombol. It's tidak penting bagaimana anda membuat hash: hanya yang anda gunakan "tombol" untuk mendapatkan unsur-unsur yang unik.
my %hash = map { $_, 1 } @array; # or a hash slice: @hash{ @array } = (); # or a foreach: $hash{$_} = 1 foreach ( @array ); my @unique = keys %hash;
Jika anda ingin menggunakan modul, coba "uniq" fungsi dari "Daftar::MoreUtils". Dalam konteks daftar itu kembali unsur-unsur yang unik, melestarikan pesanan mereka dalam daftar. Dalam konteks skalar, ia mengembalikan jumlah elemen yang unik.
use List::MoreUtils qw(uniq); my @unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 1,2,3,4,5,6,7 my $unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 7
Anda juga dapat pergi melalui masing-masing elemen dan melewati orang-orang yang anda've melihat sebelum. Gunakan hash untuk melacak. Pertama kali melihat sebuah loop elemen, elemen yang tidak memiliki kunci di %Dilihat. &Quot;next" pernyataan menciptakan kunci dan segera menggunakan nilai, yang merupakan "undef", sehingga loop terus "mendorong" dan penambahan nilai untuk kunci itu. Berikutnya waktu loop melihat elemen yang sama, key nya ada di hash dan nilai untuk kunci yang benar (karena itu's tidak 0 atau "undef"), sehingga berikutnya skips bahwa iterasi dan loop pergi ke elemen berikutnya.
my @unique = (); my %seen = (); foreach my $elem ( @array ) { next if $seen{ $elem }++; push @unique, $elem; }
Anda dapat menulis ini lebih singkat menggunakan grep, yang tidak sama hal.
my %seen = (); my @unique = grep { ! $seen{ $_ }++ } @array;
Instal klik disini::MoreUtils dari CPAN
Kemudian dalam kode anda:
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);
Saya biasa cara untuk melakukan ini adalah:
my %unique = ();
foreach my $item (@myarray)
{
$unique{$item} ++;
}
my @myuniquearray = keys %unique;
Jika anda menggunakan hash dan menambahkan item ke hash. Anda juga memiliki bonus untuk mengetahui berapa kali masing-masing item yang muncul dalam daftar.
Bisa dilakukan dengan sederhana Perl satu kapal.
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.
PKP blok ini:
Data di @di diumpankan ke dalam PETA. PETA membangun anonim hash. Tombol yang diekstrak dari hash dan memberi makan ke @keluar
Yang terakhir adalah cukup baik. I'a hanya men-tweak sedikit:
my @arr;
my @uniqarr;
foreach my $var ( @arr ){
if ( ! grep( /$var/, @uniqarr ) ){
push( @uniqarr, $var );
}
}
Saya pikir ini mungkin adalah yang paling mudah dibaca cara untuk melakukannya.
Logika: hash hanya dapat memiliki kunci unik, sehingga iterate atas array, menetapkan setiap nilai untuk masing-masing elemen dari array, menjaga elemen kunci hash. Kembali kunci-kunci hash, untuk anda yang unik array.
my @unique = keys {map {$_ => 1} @array};
Baik untuk membuat subrutin jika kita diharapkan untuk menggunakan fungsi ini beberapa kali dalam kode kita.
sub get_unique {
my %seen;
grep !$seen{$_}++, @_;
}
my @unique = get_unique(@array);
Daftar::MoreUtils
use List::MoreUtils qw(uniq);
my @unique = uniq(@array);
Sebelumnya jawaban cukup banyak meringkas cara yang mungkin untuk menyelesaikan tugas ini.
Namun, saya sarankan modifikasi bagi mereka yang don't peduli counting duplikat, tapi do peduli tentang ketertiban.
my @record = qw( yeah I mean uh right right uh yeah so well right I maybe );
my %record;
print grep !$record{$_} && ++$record{$_}, @record;
Perhatikan bahwa sebelumnya disarankan grep !$dilihat{$_}++ ...
increment $dilihat{$_}
sebelum meniadakan, sehingga kenaikan yang terjadi terlepas dari apakah itu sudah %melihat
atau tidak. Di atas, namun, sirkuit pendek ketika $record{$_}
adalah benar, meninggalkan apa yang's telah mendengar sekali 'dari %rekor
'.
Anda juga bisa pergi untuk ini kekonyolan, yang mengambil keuntungan dari autovivification dan keberadaan hash kunci:
...
grep !(exists $record{$_} || undef $record{$_}), @record;
Itu, bagaimanapun, mungkin menyebabkan beberapa kebingungan.
Dan jika anda peduli tentang tidak memesan atau duplikat menghitung, anda bisa untuk hack lain menggunakan hash irisan dan trik yang saya sebutkan:
...
undef @record{@record};
keys %record; # your record, now probably scrambled but at least deduped
Coba ini, tampaknya uniq fungsi kebutuhan daftar diurutkan untuk bekerja dengan baik.
use strict;
# Helper function to remove duplicates in a list.
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
my @teststrings = ("one", "two", "three", "one");
my @filtered = uniq @teststrings;
print "uniq: @filtered\n";
my @sorted = sort @teststrings;
print "sort: @sorted\n";
my @sortedfiltered = uniq sort @teststrings;
print "uniq sort : @sortedfiltered\n";