Come posso stampare elementi unici nell'array Perl?
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++;
}
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.