Pregunta

Estoy insertando elementos en una matriz durante una declaración while. Cada elemento es el nombre de un maestro. Termina siendo nombres de maestros duplicados en la matriz cuando finaliza el ciclo. A veces no están uno al lado del otro en la matriz, a veces lo están.

¿Cómo puedo imprimir solo los valores únicos en esa matriz después de que termine de obtener los valores introducidos en ella? Sin tener que analizar toda la matriz cada vez que quiero imprimir un elemento.

Aquí está el código después de que todo se haya insertado en la matriz:

$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
        printf $fh '"'.$faculty[$i].'"';
        $i++;
}   
¿Fue útil?

Solución

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

Otros consejos

Su mejor opción sería utilizar una herramienta incorporada (básicamente), como uniq ( como se describe en innaM) .

Si no tiene la capacidad de usar uniq y desea preservar el orden, puede usar grep para simular eso.

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

Su mejor opción sería utilizar una herramienta incorporada (básicamente), como uniq ( como se describe en innaM) .

Si no tiene la capacidad de usar uniq y desea preservar el orden, puede usar grep para simular eso.

<*>

Esto primero le da un hash donde cada clave es cada entrada. Luego, itera sobre cada elemento, cuenta cuántos de ellos hay y agrega el primero. (Actualizado con comentarios de brian d foy)

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

Esto primero le da un hash donde cada clave es cada entrada. Luego, itera sobre cada elemento, cuenta cuántos de ellos hay y agrega el primero. (Actualizado con comentarios de brian d foy)

Sugiero empujarlo a un hash. así:

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

Esta pregunta se responde con múltiples soluciones en perldoc. Simplemente escriba en la línea de comando:

perldoc -q duplicate

Nota: algunas de las respuestas que contienen un hash cambiarán el orden de la matriz. Los hashes no tienen ningún tipo de orden, por lo que obtener las claves o valores hará una lista con un orden indefinido.

Esto no se aplica a grep {! $ visto {$ _} ++} @ facultad

Este es un comando de línea única para imprimir líneas únicas en el orden en que aparece.

perl -ne '$seen{

Este es un comando de línea única para imprimir líneas únicas en el orden en que aparece.

<*>}++ || print

Este es un comando de línea única para imprimir líneas únicas en el orden en que aparece.

<*>' fileWithDuplicateValues

Acabo de encontrar el trineo 3, disfruta

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

Solo otra forma de hacerlo, útil solo si no le importa el orden :

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

Si desea evitar declarar una nueva variable, puede usar la variable global de alguna manera subdocumentada % _

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

Si necesita procesar la lista de profesores de alguna manera, un mapa sobre la matriz convertido en un hash para la fusión de claves y luego ordenar las claves es otra buena manera:

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

Si necesita procesar la lista de profesores de alguna manera, un mapa sobre la matriz convertido en un hash para la fusión de claves y luego ordenar las claves es otra buena manera:

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

Si necesita procesar la lista de profesores de alguna manera, un mapa sobre la matriz convertido en un hash para la fusión de claves y luego ordenar las claves es otra buena manera:

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

Si necesita procesar la lista de profesores de alguna manera, un mapa sobre la matriz convertido en un hash para la fusión de claves y luego ordenar las claves es otra buena manera:

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

Usted procesa la lista cambiando la expresión regular /.*/ para seleccionar o analizar y capturar en consecuencia, y puede generar una o más claves mutadas y no únicas por pasada haciendo ($ _, 1) :() arbitrariamente complejo.

Si necesita modificar los datos en vuelo con una expresión regular de sustitución, diga eliminar puntos de los nombres ( s /\.// g ), luego una sustitución de acuerdo con el patrón anterior mutará la matriz original @faculty debido al alias $ _ . Puede evitar el alias de $ _ haciendo una copia anónima de la matriz @faculty (consulte la llamada " baby cart " operator ):

<*>

En versiones más recientes de Perl, puede pasar keys a hashref, y puede usar la sustitución no destructiva:

<*>

De lo contrario, las soluciones grep o $ seen [$ _] ++ en otros lugares pueden ser preferibles.

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

Usted procesa la lista cambiando la expresión regular /.*/ para seleccionar o analizar y capturar en consecuencia, y puede generar una o más claves mutadas y no únicas por pasada haciendo ($ _, 1) :() arbitrariamente complejo.

Si necesita modificar los datos en vuelo con una expresión regular de sustitución, diga eliminar puntos de los nombres ( s /\.// g ), luego una sustitución de acuerdo con el patrón anterior mutará la matriz original @faculty debido al alias $ _ . Puede evitar el alias de $ _ haciendo una copia anónima de la matriz @faculty (consulte la llamada " baby cart " operator ):

<*>

En versiones más recientes de Perl, puede pasar keys a hashref, y puede usar la sustitución no destructiva:

<*>

De lo contrario, las soluciones grep o $ seen [$ _] ++ en otros lugares pueden ser preferibles.

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

Usted procesa la lista cambiando la expresión regular /.*/ para seleccionar o analizar y capturar en consecuencia, y puede generar una o más claves mutadas y no únicas por pasada haciendo ($ _, 1) :() arbitrariamente complejo.

Si necesita modificar los datos en vuelo con una expresión regular de sustitución, diga eliminar puntos de los nombres ( s /\.// g ), luego una sustitución de acuerdo con el patrón anterior mutará la matriz original @faculty debido al alias $ _ . Puede evitar el alias de $ _ haciendo una copia anónima de la matriz @faculty (consulte la llamada " baby cart " operator ):

<*>

En versiones más recientes de Perl, puede pasar keys a hashref, y puede usar la sustitución no destructiva:

<*>

De lo contrario, las soluciones grep o $ seen [$ _] ++ en otros lugares pueden ser preferibles.

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

Usted procesa la lista cambiando la expresión regular /.*/ para seleccionar o analizar y capturar en consecuencia, y puede generar una o más claves mutadas y no únicas por pasada haciendo ($ _, 1) :() arbitrariamente complejo.

Si necesita modificar los datos en vuelo con una expresión regular de sustitución, diga eliminar puntos de los nombres ( s /\.// g ), luego una sustitución de acuerdo con el patrón anterior mutará la matriz original @faculty debido al alias $ _ . Puede evitar el alias de $ _ haciendo una copia anónima de la matriz @faculty (consulte la llamada " baby cart " operator ):

<*>

En versiones más recientes de Perl, puede pasar keys a hashref, y puede usar la sustitución no destructiva:

<*>

De lo contrario, las soluciones grep o $ seen [$ _] ++ en otros lugares pueden ser preferibles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top