• Publicidad

Unir arrays en Perl

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

Unir arrays en Perl

Notapor mariel » 2011-05-02 14:38 @651

¿Cómo puedo hacer para unir 2 array para que me muestre los datos ordenados como se indica líneas abajo?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@fecha=('13/12/2010','14/12/2010','15/12/2010')
@monto=('150','360','50')
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

y obtener el siguiente resultado
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
14/12/2010->360
13/12/2010->150
15/12/2010->50
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
mariel
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2011-05-02 14:35 @649

Publicidad

Re: Unir arrays en Perl

Notapor explorer » 2011-05-02 14:45 @656

Bienvenida a los foros de Perl en español, mariel.

Debes hacer un bucle que recorra los índices de uno de los array, y dentro de él, ir creando los elementos del hash a partir de los elementos indexados de los arrays.
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: Unir arrays en Perl

Notapor mariel » 2011-05-02 14:49 @659

¿Cómo? ¿Podriís darme un ejemplo? Soy nueva en esto.

Estoy realizando esto:

%mzdata = map { @monto[$_] => @fecha[$_] };
foreach my $llave (reverse (sort keys %mzdata)){
//imprimo los valores

}

Pero no sale nada.
mariel
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2011-05-02 14:35 @649

Re: Unir arrays en Perl

Notapor explorer » 2011-05-02 16:29 @729

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @fecha = qw(13/12/2010 14/12/2010 15/12/2010);
  2. my @monto = qw(150        360        50        );
  3.  
  4. my %mzdata;
  5. for my $i (0 .. $#fecha) {                    # recorremos todos los índices de un array
  6.     $mzdata{ $fecha[ $i ] } = $monto[ $i ];   # el i-ésimo valor de @fecha es la clave de %mzdata, y
  7.                                               # el i-ésimo valor de @monto es el valor correspondiente
  8. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Unir arrays en Perl

Notapor mariel » 2011-05-02 16:40 @736

Gracias por la ayuda. ¿Y cómo haría para ordenarlo utilizando reverse (sort)?
mariel
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2011-05-02 14:35 @649

Re: Unir arrays en Perl

Notapor explorer » 2011-05-02 16:50 @743

Pues usando reverse y sort, según lo que quieras ordenar.
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: Unir arrays en Perl

Notapor mariel » 2011-05-02 16:52 @744

No me sale.

Tengo esto:
%mzdata= ('59932','20-01-2011 AL 26-01-2011','57,437.00','30-12-2010 AL 05-01-2011','221,189.00','13-01-2011 AL 19-01-2011');

foreach my $llave(reverse(sort keys %mzdata)){
$G++;
sprintf($mzdata{$llave});
sprintf("%02d",$llave);

}

pero no lo ordena bien. Sale ordenado así:

20-01-2011 AL 26-01-2011 59,932.00
30-12-2010 AL 05-01-2011 57,437.00
13-01-2011 AL 19-01-2011 221,189.00

No toma en cuenta el valor de 6 dígitos.
mariel
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2011-05-02 14:35 @649

Re: Unir arrays en Perl

Notapor explorer » 2011-05-02 17:05 @754

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my %mzdata= (
  4.     '59932'      => '20-01-2011 AL 26-01-2011',
  5.     '57,437.00'  => '30-12-2010 AL 05-01-2011',
  6.     '221,189.00' => '13-01-2011 AL 19-01-2011',
  7. );
  8.  
  9. for my $llave (reverse(sort { $a <=> $b } keys %mzdata)) {
  10.     printf("%s %.2f\n", $mzdata{$llave}, $llave);
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
20-01-2011 AL 26-01-2011 59932.00
13-01-2011 AL 19-01-2011 221.00
30-12-2010 AL 05-01-2011 57.00
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y ya sale ordenado numéricamente en orden inverso.

La función sort(), por defecto, solo hace ordenación alfabética, no numérica. Por eso tenemos que poner la subrutina { $a <=> $b }, para indicar que la ordenación debe usar el operador numérico '<=>'.

Otro detalle... nos podemos ahorrar el reverse() si cambiamos un poco más la subrutina del sort():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $llave (sort { $b <=> $a } keys %mzdata) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Cambiando el orden de $a y $b, indicamos si el orden es ascendente o descendente.

Finalmente... no hace la comparación con los seis dígitos... porque las ',' no forman parte de un número. Debes quitarlas antes.
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: Unir arrays en Perl

Notapor mariel » 2011-05-02 17:13 @759

Muchas gracias.
mariel
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2011-05-02 14:35 @649


Volver a Básico

¿Quién está conectado?

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