Question

J'insère des éléments dans un tableau lors d'une déclaration while. Chaque élément est le nom d'un enseignant. Il finit par être des noms d'enseignant en double dans le tableau lorsque la boucle se termine. Parfois, ils ne sont pas côte à côte dans le tableau, parfois, ils le sont.

Comment puis-je n’imprimer que les valeurs uniques de ce tableau une fois que les valeurs finies sont insérées? Sans avoir à analyser tout le tableau à chaque fois que je veux imprimer un élément.

Voici le code une fois que tout a été placé dans le tableau:

$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
        printf $fh '"'.$faculty[$i].'"';
        $i++;
}   
Était-ce utile?

La solution

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

Autres conseils

Votre meilleur choix serait d'utiliser un outil (essentiellement) intégré, comme uniq ( comme décrit par innaM) .

Si vous ne pouvez pas utiliser uniq et que vous souhaitez conserver l'ordre, vous pouvez utiliser grep pour simuler cela.

my %seen;
my @unique = grep { ! $seen{

Votre meilleur choix serait d'utiliser un outil (essentiellement) intégré, comme uniq ( comme décrit par innaM) .

Si vous ne pouvez pas utiliser uniq et que vous souhaitez conserver l'ordre, vous pouvez utiliser grep pour simuler cela.

<*>

Ceci vous donne d’abord un hachage où chaque clé est chaque entrée. Ensuite, vous parcourez chaque élément en comptant le nombre d’éléments et en ajoutant le premier. (Mise à jour avec les commentaires de Brian D Foy)

}++ } @faculty; # printing, etc.

Ceci vous donne d’abord un hachage où chaque clé est chaque entrée. Ensuite, vous parcourez chaque élément en comptant le nombre d’éléments et en ajoutant le premier. (Mise à jour avec les commentaires de Brian D Foy)

Je suggère de le pousser dans un hash. comme ceci:

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"; 

Cette question a reçu une réponse avec plusieurs solutions dans perldoc. Il suffit de taper sur la ligne de commande:

perldoc -q duplicate

Remarque: certaines réponses contenant un hachage modifieront l’ordre du tableau. Les hachages n'ont pas d'ordre, donc obtenir les clés ou les valeurs fera une liste avec un ordre indéfini.

Ceci ne s'applique pas à grep {! $ seen {$ _} ++} @faculty

Il s'agit d'une commande unique pour imprimer des lignes uniques dans l'ordre dans lequel elles apparaissent.

perl -ne '$seen{

Il s'agit d'une commande unique pour imprimer des lignes uniques dans l'ordre dans lequel elles apparaissent.

<*>}++ || print

Il s'agit d'une commande unique pour imprimer des lignes uniques dans l'ordre dans lequel elles apparaissent.

<*>' fileWithDuplicateValues

Je viens de trouver 3 doublures éculées, profitez-en

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

Juste une autre façon de le faire, utile uniquement si vous ne vous souciez pas de l'ordre :

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

Si vous souhaitez éviter de déclarer une nouvelle variable, vous pouvez utiliser la variable globale quelque peu sous-documentée % _

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

Si vous devez traiter la liste des professeurs de quelque manière que ce soit, une carte du tableau convertie en hachage pour la fusion des clés, puis le tri des clés, constituent un autre bon moyen:

my @deduped = sort keys %{{ map { /.*/? (

Si vous devez traiter la liste des professeurs de quelque manière que ce soit, une carte du tableau convertie en hachage pour la fusion des clés, puis le tri des clés, constituent un autre bon moyen:

my @deduped = sort keys %{{ map {/.*/? do{s/\.//g; (

Si vous devez traiter la liste des professeurs de quelque manière que ce soit, une carte du tableau convertie en hachage pour la fusion des clés, puis le tri des clés, constituent un autre bon moyen:

my @deduped = sort keys %{{ map { /.*/? (

Si vous devez traiter la liste des professeurs de quelque manière que ce soit, une carte du tableau convertie en hachage pour la fusion des clés, puis le tri des clés, constituent un autre bon moyen:

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

Vous traitez la liste en modifiant la regex /.*/ pour sélectionner ou analyser et capturer en conséquence, et vous pouvez générer une ou plusieurs clés mutées non uniques par passe en créant . ($ _, 1): () complexe arbitrairement.

Si vous devez modifier les données en vol avec une expression rationnelle de substitution, par exemple, supprimez les points des noms ( s /\.// g ), puis effectuez une substitution selon le modèle ci-dessus. le tableau @faculty d'origine sera muté en raison de l'aliasing $ _ . Vous pouvez contourner l'aliasing $ _ en créant une copie anonyme du tableau @faculty (voir le soi-disant " Opérateur "panier-bébé" ):

<*>

Dans les versions plus récentes de Perl, vous pouvez transmettre à clés un hashref, et vous pouvez utiliser la substitution non destructive:

<*>

Sinon, les solutions grep ou $ seen [$ _] ++ peuvent être préférables ailleurs.

,1):() } @faculty }}; print join("\n", @deduped)."\n";

Vous traitez la liste en modifiant la regex /.*/ pour sélectionner ou analyser et capturer en conséquence, et vous pouvez générer une ou plusieurs clés mutées non uniques par passe en créant . ($ _, 1): () complexe arbitrairement.

Si vous devez modifier les données en vol avec une expression rationnelle de substitution, par exemple, supprimez les points des noms ( s /\.// g ), puis effectuez une substitution selon le modèle ci-dessus. le tableau @faculty d'origine sera muté en raison de l'aliasing $ _ . Vous pouvez contourner l'aliasing $ _ en créant une copie anonyme du tableau @faculty (voir le soi-disant " Opérateur "panier-bébé" ):

<*>

Dans les versions plus récentes de Perl, vous pouvez transmettre à clés un hashref, et vous pouvez utiliser la substitution non destructive:

<*>

Sinon, les solutions grep ou $ seen [$ _] ++ peuvent être préférables ailleurs.

,1)}:()} @{[ @faculty ]} }}; print join("\n", @deduped)."\n"; print "Unmolested array:\n".join("\n", @faculty)."\n";

Vous traitez la liste en modifiant la regex /.*/ pour sélectionner ou analyser et capturer en conséquence, et vous pouvez générer une ou plusieurs clés mutées non uniques par passe en créant . ($ _, 1): () complexe arbitrairement.

Si vous devez modifier les données en vol avec une expression rationnelle de substitution, par exemple, supprimez les points des noms ( s /\.// g ), puis effectuez une substitution selon le modèle ci-dessus. le tableau @faculty d'origine sera muté en raison de l'aliasing $ _ . Vous pouvez contourner l'aliasing $ _ en créant une copie anonyme du tableau @faculty (voir le soi-disant " Opérateur "panier-bébé" ):

<*>

Dans les versions plus récentes de Perl, vous pouvez transmettre à clés un hashref, et vous pouvez utiliser la substitution non destructive:

<*>

Sinon, les solutions grep ou $ seen [$ _] ++ peuvent être préférables ailleurs.

,1):() } @faculty }}; print join("\n", @deduped)."\n";

Vous traitez la liste en modifiant la regex /.*/ pour sélectionner ou analyser et capturer en conséquence, et vous pouvez générer une ou plusieurs clés mutées non uniques par passe en créant . ($ _, 1): () complexe arbitrairement.

Si vous devez modifier les données en vol avec une expression rationnelle de substitution, par exemple, supprimez les points des noms ( s /\.// g ), puis effectuez une substitution selon le modèle ci-dessus. le tableau @faculty d'origine sera muté en raison de l'aliasing $ _ . Vous pouvez contourner l'aliasing $ _ en créant une copie anonyme du tableau @faculty (voir le soi-disant " Opérateur "panier-bébé" ):

<*>

Dans les versions plus récentes de Perl, vous pouvez transmettre à clés un hashref, et vous pouvez utiliser la substitution non destructive:

<*>

Sinon, les solutions grep ou $ seen [$ _] ++ peuvent être préférables ailleurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top