• Publicidad

Ordenar array

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ordenar array

Notapor Andy_ » 2011-01-27 08:39 @402

Hola,
quiero ordenar un array que contiene líneas que comienzan por un número y van seguidas de una cadena. Este es un ejemplo del array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
322 SDSD
123 DSDAS
423 FFRRF
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


He probado con @array = sort {$a <=> $b } @array, y funciona, pero me salta error ya que el array contiene elementos no numéricos.

¿Existe alguna variación del sort que se pueda usar?

Gracias.
Andy_
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-01-27 08:24 @391

Publicidad

Re: Ordenar array

Notapor explorer » 2011-01-27 08:56 @414

Bienvenido a los foros de Perl en Español, Andy_.

Puedes intentarlo con la comparación alfanumérica:

@array = sort {$a cmp $b } @array
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ordenar array

Notapor Andy_ » 2011-01-27 11:07 @505

Lo acabo de probar pero lo ordena como si fuese un sort a secas: 1 10 2 3...

Me parece raro que no haya una función que se pueda usar...

He probado a quitar 'use warnings' del principio y funciona sin el mensaje de error, pero no sé si el programa está bien. ¿Es necesario ponerlo para que el programa esté completo?
Andy_
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-01-27 08:24 @391

Re: Ordenar array

Notapor explorer » 2011-01-27 15:48 @700

Pero es que te he dado la solución de la ordenación alfanumérica al ver que la primera columna contiene números de 3 dígitos, por lo que supuse que siempre tendrían 3 dígitos, pero por lo que se ve, no es así.

Puedes hacer una transformada de Schwartz:

Se lee de abajo a arriba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @array
  2.     = map  { $_->[1]               }
  3.       sort { $a->[0] <=> $b->[0]   }
  4.       map  { [ (split " ")[0], $_] }
  5.       @array
  6.     ;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

5: el @array de donde partimos. Contiene las líneas a ordenar
4: creamos un array anónimo, con dos elementos. El primero es la primera columna de cada línea (el split(" ", $_) parte la línea por los espacios, y nos quedamos con la primera columna ([0])). El segundo componente es toda la línea, tal cual ($_)
3: Ordenamos, de forma ascendente y numérica, por el primer elemento de los array que salen de 4
2: el map{} extrae el segundo componente de los array ya ordenados, que, recordemos, era toda la línea
1: el resultado se queda en el propio @array.

Creo recordar que hay módulos que tratan ficheros de forma tabular (o tabla) y en ellos permite realizar algunas operaciones de extracción y de ordenación. Pero bueno, para lo que quieres te vale con esa transformada.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ordenar array

Notapor wanako » 2011-01-27 15:57 @706

Cierto es lo que dice Explorer.

Opción B: Módulo Sort::Naturally.

Opción C:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. #use diagnostics;
  4.  
  5. my $useless = 1;
  6.  
  7. my @array = ('1 UNO','2 DOS','322 TRESDOSDOS','123 UNODOSTRES','423 CUATRODOSTRES');
  8.  
  9. print "@array\n";
  10.  
  11. {   # Inicio del Bloque
  12.  
  13.     no warnings; # desactivamos warnings
  14.                  # dentro del bloque
  15.  
  16.     @array = sort { $a <=> $b } @array;
  17.  
  18. }   # Fin del Bloque
  19.  
  20. print "@array\n";
  21.  
  22. # Mal uso de una variable para
  23. $useless; # comprobar que warnings
  24. # funciona fuera del bloque.
  25.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Edición: Agregados comentarios acorde al nivel básico.
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Ordenar array

Notapor Andy_ » 2011-02-01 07:48 @367

Al final he puesto lo de 'no warnings' dentro del bucle y funciona perfectamente.

¡Muchas gracias!

Otra duda, ¿saben cómo se puede quitar a un array el primer carácter de cada línea? En concreto es un espacio en blanco.
Andy_
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-01-27 08:24 @391

Re: Ordenar array

Notapor explorer » 2011-02-01 08:12 @383

¡Puff! Se puede hacer de muchas maneras...

Aquí va mi intento:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@array = map { substr $_, 1 } @array;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora te toca a ti entenderlo. Si tienes dudas, pregunta.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ordenar array

Notapor salva » 2011-02-02 06:15 @302

Andy_ escribiste:¿saben cómo se puede quitar a un array el primer carácter de cada línea? En concreto es un espacio en blanco.

Para borrar los espacios al principio de una línea, lo más habitual es utilizar la siguiente expresión regular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
s/^\s+//;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o en un bucle
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
s/^\s+// for @array;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(¡ups, que despiste! corregido para anclar la expresión regular al principio de la linea, como comenta wanako)
Última edición por salva el 2011-02-02 09:53 @453, editado 2 veces en total
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Ordenar array

Notapor wanako » 2011-02-02 09:49 @451

Esto suponiendo que siempre tenemos un espacio al principio de cada línea, de lo contrario borramos el primer número o el primer espacio encontrado entre el número y las letras, yo lo haría así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
s/^\s+// for @array;

# o tal vez

s/\B\s+// for @array;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


O mejor aún, dentro del mismo bucle que forma el @array, es por eso que tienes que publicar el código.
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Ordenar array

Notapor Andy_ » 2011-02-03 09:27 @436

¿Debería funcionar si pongo esto?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach my $linea (@array) {
  2.    $linea =~ s/^\s+//;
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sólo quiero que sustituya el primer espacio, pero de todas formas lo he probado y no modifica el array, sigue con los espacios.
Andy_
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-01-27 08:24 @391

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados