Domanda

Sto spingendo gli elementi in un array durante un'istruzione while. Ogni elemento è il nome di un insegnante. Alla fine il ciclo termina con la duplicazione dei nomi degli insegnanti nell'array. A volte non sono vicini l'uno all'altro nell'array, a volte lo sono.

Come posso stampare solo i valori univoci in quell'array dopo che i suoi valori sono stati inseriti? Senza dover analizzare l'intero array ogni volta che voglio stampare un elemento.

Ecco il codice dopo che tutto è stato inserito nell'array:

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

Soluzione

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

Altri suggerimenti

La soluzione migliore sarebbe quella di utilizzare uno strumento (sostanzialmente) integrato, come uniq ( come descritto da innaM) .

Se non hai la possibilità di usare uniq e vuoi preservare l'ordine, puoi usare grep per simularlo.

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

La soluzione migliore sarebbe quella di utilizzare uno strumento (sostanzialmente) integrato, come uniq ( come descritto da innaM) .

Se non hai la possibilità di usare uniq e vuoi preservare l'ordine, puoi usare grep per simularlo.

<*>

Questa prima ti dà un hash in cui ogni chiave è ogni voce. Quindi, esegui l'iterazione su ciascun elemento, contando quanti ce ne sono e aggiungendo il primo. (Aggiornato con i commenti di brian d foy)

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

Questa prima ti dà un hash in cui ogni chiave è ogni voce. Quindi, esegui l'iterazione su ciascun elemento, contando quanti ce ne sono e aggiungendo il primo. (Aggiornato con i commenti di brian d foy)

Suggerisco di spingerlo in un hash. in questo modo:

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

A questa domanda viene data risposta con più soluzioni in perldoc. Basta digitare alla riga di comando:

perldoc -q duplicate

Nota: alcune delle risposte contenenti un hash cambieranno l'ordinamento dell'array. Gli hash non hanno alcun tipo di ordine, quindi ottenere le chiavi o i valori farà un elenco con un ordine indefinito.

Questo non si applica a grep {! $ seen {$ _} ++} @faculty

Questo è un comando di una riga per stampare linee uniche nell'ordine in cui appare.

perl -ne '$seen{

Questo è un comando di una riga per stampare linee uniche nell'ordine in cui appare.

<*>}++ || print

Questo è un comando di una riga per stampare linee uniche nell'ordine in cui appare.

<*>' fileWithDuplicateValues

Ho appena trovato 3 liner hackney, divertiti

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

Solo un altro modo per farlo, utile solo se non ti interessa l'ordine :

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

Se si desidera evitare di dichiarare una nuova variabile, è possibile utilizzare la variabile globale in qualche modo non documentata % _

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

Se è necessario elaborare l'elenco delle facoltà in qualsiasi modo, una mappa sull'array convertita in un hash per la fusione delle chiavi e quindi l'ordinamento delle chiavi è un altro buon metodo:

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

Se è necessario elaborare l'elenco delle facoltà in qualsiasi modo, una mappa sull'array convertita in un hash per la fusione delle chiavi e quindi l'ordinamento delle chiavi è un altro buon metodo:

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

Se è necessario elaborare l'elenco delle facoltà in qualsiasi modo, una mappa sull'array convertita in un hash per la fusione delle chiavi e quindi l'ordinamento delle chiavi è un altro buon metodo:

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

Se è necessario elaborare l'elenco delle facoltà in qualsiasi modo, una mappa sull'array convertita in un hash per la fusione delle chiavi e quindi l'ordinamento delle chiavi è un altro buon metodo:

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

Elaborate l'elenco modificando la regex /.*/ per la selezione o l'analisi e l'acquisizione di conseguenza, e potete produrre una o più chiavi mutate, non univoche per passaggio, facendo ($ _, 1) :() arbitrariamente complesso.

Se è necessario modificare i dati in volo con una regex di sostituzione, dire di rimuovere i punti dai nomi ( s /\.// g ), quindi una sostituzione in base al modello sopra muterà l'array @faculty originale a causa dell'aliasing $ _ . Puoi aggirare l'aliasing $ _ facendo una copia anonima dell'array @faculty (vedi il cosiddetto " baby cart " operator ):

<*>

Nelle versioni più recenti di Perl, puoi passare a chiavi un hashref e puoi usare la sostituzione non distruttiva:

<*>

Altrimenti, le soluzioni grep o $ visto [$ _] ++ altrove potrebbero essere preferibili altrove.

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

Elaborate l'elenco modificando la regex /.*/ per la selezione o l'analisi e l'acquisizione di conseguenza, e potete produrre una o più chiavi mutate, non univoche per passaggio, facendo ($ _, 1) :() arbitrariamente complesso.

Se è necessario modificare i dati in volo con una regex di sostituzione, dire di rimuovere i punti dai nomi ( s /\.// g ), quindi una sostituzione in base al modello sopra muterà l'array @faculty originale a causa dell'aliasing $ _ . Puoi aggirare l'aliasing $ _ facendo una copia anonima dell'array @faculty (vedi il cosiddetto " baby cart " operator ):

<*>

Nelle versioni più recenti di Perl, puoi passare a chiavi un hashref e puoi usare la sostituzione non distruttiva:

<*>

Altrimenti, le soluzioni grep o $ visto [$ _] ++ altrove potrebbero essere preferibili altrove.

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

Elaborate l'elenco modificando la regex /.*/ per la selezione o l'analisi e l'acquisizione di conseguenza, e potete produrre una o più chiavi mutate, non univoche per passaggio, facendo ($ _, 1) :() arbitrariamente complesso.

Se è necessario modificare i dati in volo con una regex di sostituzione, dire di rimuovere i punti dai nomi ( s /\.// g ), quindi una sostituzione in base al modello sopra muterà l'array @faculty originale a causa dell'aliasing $ _ . Puoi aggirare l'aliasing $ _ facendo una copia anonima dell'array @faculty (vedi il cosiddetto " baby cart " operator ):

<*>

Nelle versioni più recenti di Perl, puoi passare a chiavi un hashref e puoi usare la sostituzione non distruttiva:

<*>

Altrimenti, le soluzioni grep o $ visto [$ _] ++ altrove potrebbero essere preferibili altrove.

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

Elaborate l'elenco modificando la regex /.*/ per la selezione o l'analisi e l'acquisizione di conseguenza, e potete produrre una o più chiavi mutate, non univoche per passaggio, facendo ($ _, 1) :() arbitrariamente complesso.

Se è necessario modificare i dati in volo con una regex di sostituzione, dire di rimuovere i punti dai nomi ( s /\.// g ), quindi una sostituzione in base al modello sopra muterà l'array @faculty originale a causa dell'aliasing $ _ . Puoi aggirare l'aliasing $ _ facendo una copia anonima dell'array @faculty (vedi il cosiddetto " baby cart " operator ):

<*>

Nelle versioni più recenti di Perl, puoi passare a chiavi un hashref e puoi usare la sostituzione non distruttiva:

<*>

Altrimenti, le soluzioni grep o $ visto [$ _] ++ altrove potrebbero essere preferibili altrove.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top