Bagaimana untuk mendapatkan unsur-unsur yang unik dari Perl daftar

Tugas. Dalam program dalam bahasa pemrograman Perl memiliki daftar. Daftar string dan angka. Anda perlu untuk mendapatkan nilai-nilai unik dari daftar ini.

Solusi menggunakan fungsi uniq dari perpustakaan List::Util

Cara termudah dan paling nyaman cara untuk memecahkan masalah ini adalah dengan menggunakan fungsi uniq dari perpustakaan List::Util. Berikut adalah contoh kode:

▶ Run
#!/usr/bin/perl

use List::Util qw(uniq);
use Data::Dumper;

my @arr = uniq('one', 'one', 'b', 'one', 'b', 4);

print Dumper \@arr;

Jika anda menyimpan teks ke file script.pl, dan kemudian jalankan di console perl script.pl, maka akan muncul pada layar:

$VAR1 = [
          'one',
          'b',
          4
        ];

Fungsi uniq mempertahankan urutan unsur-unsur, dan itu bekerja dengan benar jika daftar undef.

Kode ini akan bekerja dari Perl 5.26. Dalam versi sebelumnya dari Perl berisi versi perpustakaan List::Util di mana tidak ada fungsi uniq. Jadi dalam rangka untuk untuk menggunakan ini solusi yang anda butuhkan untuk memperbarui Perl atau untuk dimasukkan ke versi yang lebih baru perpustakaan List::Util.

Dokumentasi resmi

Berikut adalah cuplikan dari output perldoc List::Util tentang fungsi uniq:

  uniq
        my @subset = uniq @values

    *Since version 1.45.*

    Filters a list of values to remove subsequent duplicates, as judged by a
    DWIM-ish string equality or "undef" test. Preserves the order of unique
    elements, and retains the first value of any duplicate set.

        my $count = uniq @values

    In scalar context, returns the number of elements that would have been
    returned as a list.

    The "undef" value is treated by this function as distinct from the empty
    string, and no warning will be produced. It is left as-is in the
    returned list. Subsequent "undef" values are still considered identical
    to the first, and will be removed.

Keputusan sendiri

Hanya cukup untuk menulis sebuah versi sederhana dari fungsi uniq dari perpustakaan List::Util:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

sub uniq {
     my (@values) = @_;

     my %h = map {$_ => 1} @values;

     return keys %h;
}

my @arr = uniq('one', 'one', 'b', 'one', 'b', 4);

print Dumper \@arr;

Kode ini segera bekerja pada setiap versi Perl. Berikut ini adalah tiga baris dari subs uniq:

  • my (@values) = @_; — menempatkan argumen yang dilewatkan ke subwoofer pada variabel @values
  • my %h = map {$_ => 1} @values; — untuk setiap elemen dari @values telah menciptakan sebuah daftar dari dua unsur, unsur asli dan satuan, dan semua yang dihasilkan daftar bersama-sama ke dalam satu daftar dan menetapkan bahwa daftar untuk hash. Hash adalah unordered set kunci-nilai. Salah satu kunci bisa hanya satu nilai. Karena ini milik hash menghapus semua duplikat.
  • return keys %h; — kembali daftar hanya terdiri dari tombol

Tapi dibandingkan dengan fungsi uniq dari perpustakaan List::Util kode ini memiliki kekurangan:

  • fungsi kita uniq kembali unsur-unsur dalam rangka sewenang-wenang. Berbeda berjalan dari kode yang sama yang menyebabkan hasil yang berbeda (nilai yang dikembalikan oleh fungsi uniq akan sama, tetapi urutan di mana mereka berada akan berbeda)
  • kami fungsi tidak bekerja dengan benar jika daftar undef. Kami menggunakan semua nilai-nilai dari daftar sebagai hash kunci. Dan undef tidak dapat menjadi kunci di hash. Ketika anda mencoba untuk menggunakan undef sebagai kunci dan akan digunakan untuk string kosong bukan undef.

Artikel lainnya