Comment obtenir des éléments uniques de Perl liste

De la tâche. Dans un programme en langage de programmation Perl une liste. Dans la liste de la chaînes et les nombres. Besoin d'obtenir des valeurs uniques de cette liste.

La solution à l'aide de la fonction uniq de la bibliothèque List::Util

Le moyen le plus simple pour résoudre ce problème est d'utiliser la fonction uniq de la bibliothèque List::Util. Voici un exemple de code:

▶ Run
#!/usr/bin/perl

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

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

print Dumper \@arr;

Si vous enregistrez ce texte dans un fichier script.pl, puis exécuter dans la console perl script.pl, sur l'écran s'affiche:

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

La fonction uniq conserve l'ordre des éléments et il fonctionne si dans la liste il y undef.

Ce code fonctionnera a partir de la version de Perl 5.26. Dans les anciennes versions de Perl contient la version de la bibliothèque List::Util en fonction uniq. De sorte que pour utiliser ce une décision, vous devez soit mettre à jour Perl, ou de mettre une version plus récente la bibliothèque List::Util.

La documentation officielle

Voici un extrait de la sortie de la commande perldoc List::Util sur 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.

Propre décision

Il suffit simplement d'écrire vous-même une version simplifiée de la fonction uniq à partir de la bibliothèque 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;

Ce code fonctionne sur n'importe quelle version de Perl. Voici les trois lignes de saba uniq:

  • my (@values) = @_; — placé les arguments qui ont été transférés au sabu dans la variable @values
  • my %h = map {$_ => 1} @values; — pour chaque élément de la @values ont créé une liste de deux éléments: un élément primordial de l'unité, et toutes les listes ont été fusionnées dans la liste et donné à cette liste хешу. Le hachage est une un ensemble de paires clé-valeur. Une clé peut être une seule valeur. Grâce à cette propriété de hachage sont nettoyées tous les doubles.
  • return keys %h; — ramené une liste composée uniquement de clés de hachage

Mais par rapport à la fonction uniq de la bibliothèque de List::Util de ce code, il ya des inconvénients:

  • notre fonction uniq renvoie les éléments dans un ordre aléatoire. Les différentes débuts du même code conduira à des résultats différents (de la valeur que retourne la fonction uniq sont les mêmes, mais voici l'ordre dans lequel ils sont situés sera différent)
  • notre fonction ne fonctionne pas correctement si dans la liste il y undef. Nous utilisons toutes les valeurs dans la liste de clés de hachage. Et undef ne peut pas être la clé dans le hachage. Lorsque vous essayez d'utiliser undef comme clé d'alerte et sera utilisé une chaîne vide à la place de undef.

Autres articles