So erhalten Sie einzigartige Elemente aus Perl Liste

Aufgabe. Im Programm in der Programmiersprache Perl gibt es eine Liste. In der Liste gibt es Strings und zahlen. Brauchen, um eindeutige Werte aus dieser Liste.

Lösung mit Hilfe der Funktion uniq aus der Bibliothek List::Util

Der einfachste Weg, um diese Aufgabe zu lösen ist die Verwendung Funktion uniq aus der Bibliothek List::Util. Hier ist der Beispielcode:

▶ Run
#!/usr/bin/perl

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

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

print Dumper \@arr;

Wenn Sie diesen Text in die Datei script.pl, und dann in der Konsole ausführen perl script.pl, dann erscheint auf dem Bildschirm:

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

Funktion uniq speichert die Reihenfolge der Elemente und es funktioniert einwandfrei wenn in der Liste gibt es undef.

Dieser Code funktioniert Perl ab der Version 5.26. In früheren Versionen von Perl enthalten Version der Bibliothek List::Util in dem noch keine Funktion uniq. Also, um verwenden Sie diese Entscheidung müssen Sie entweder aktualisieren Perl, zu liefern oder eine neuere Version Bibliothek List::Util.

Die offizielle Dokumentation

Hier ist ein Ausschnitt der Ausgabe des Befehls perldoc List::Util über die Funktion 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.

Eigene Entscheidung

Ziemlich einfach selbst schreiben Sie eine vereinfachte Variante der Funktion uniq aus der Bibliothek 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;

Diesen Code sofort funktioniert auf jeder beliebigen Version von Perl. Hier sind drei Zeilen aus Saba uniq:

  • my (@values) = @_; — haben die Argumente, die übergeben Sabu in die Variable @values
  • my %h = map {$_ => 1} @values; — für jedes Element aus @values erstellt eine Liste aus zwei Elementen — ur-Element und Einheit, und alle daraus resultierenden Listen vereinigt in einer Liste haben und diese Liste хешу. Hash ist eine ungeordnete Reihe von Schlüssel-Wert-Paare. Nach einem Schlüssel kann nur ein Wert. Aufgrund dieser Eigenschaft Hash entfernt alle Duplikate.
  • return keys %h; — wieder die Liste besteht nur aus Schlüsseln Hash

Aber im Vergleich mit der Funktion uniq aus der Bibliothek List::Util bei diesem Code gibt es einen Fehler:

  • unsere Funktion uniq gibt die Elemente in einer zufälligen Reihenfolge. Verschiedene Starts desselben Codes führen zu unterschiedlichen Ergebnissen (Werte gibt die Funktion uniq werden die gleichen, aber die Reihenfolge, in welcher Sie sich befinden abweichen)
  • unsere Funktion nicht korrekt funktioniert, wenn in der Liste gibt es undef. Wir verwenden alle Werte aus der Liste als Schlüssel für den Hash. Und undef kann nicht als Schlüssel in хеше. Wenn Sie versuchen, undef als Schlüssel wird eine Warnung ausgegeben und eine leere Zeichenfolge wird verwendet anstelle von undef.

Andere Artikel