• Publicidad

Pasar varios hash desde subrutina

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

Pasar varios hash desde subrutina

Notapor ricar » 2009-11-09 16:18 @721

Hola de nuevo.

Hace poco me surgía la duda con los array y ahora con los hash.

Si quiero retornar varios hashes desde una función:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
return (\%hash_1, \%hash_2, \%hash_3);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La llamada, la haré, como en el caso de los arrays, de la siguiente forma, puesto que es una referencia lo que pasa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($ref_1, $ref_2, $ref_3) = miFuncion();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Y para usar los valores?. Esta es mi duda.

Con los arrays, por ejemplo hubiésemos hecho algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $key (@$ref_1) {
    #... loquesea
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero con los hash me da error. Siguiendo la lógica haría:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $key (keys %$ref_1) {
    #... loquesea
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero me temo que estoy metiendo la pata hasta el fondo.

¿Alguien me puede indicar qué debo hacer?

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Publicidad

Re: Pasar varios hash desde subrutina

Notapor explorer » 2009-11-09 16:33 @731

Pues a mi me funciona... :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. sub miFuncion {
  7.     my %hash1 = ( a => 1, b => 2, c => 3 );
  8.     my %hash2 = ( m => 1000, v => 5, l => 50 );
  9.     my %hash3 = ( SG => 'a', TR => 'de' );
  10.  
  11.     return \%hash1, \%hash2, \%hash3;
  12. }
  13.  
  14. my ($ref_1, $ref_2, $ref_3) = miFuncion();
  15.  
  16. print $ref_1->{b}, "\n";
  17.  
  18. for my $key (keys %$ref_1) {
  19.     print "$key => $ref_1->{$key} \n";
  20. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2
c => 3
a => 1
b => 2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Más información en perldoc perlsub, sección Pass by Reference.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pasar varios hash desde subrutina

Notapor ricar » 2009-11-10 02:30 @146

Muchas gracias, explorer.

Lo hacía bien excepto cuando utilizaba el hash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $key (keys %$ref_1) {
    print "$key => $ref_1{$key} \n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En vez de hacerlo de forma correcta que muestras:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $key (keys %$ref_1) {
    print "$key => $ref_1->{$key} \n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por eso me daba un error de sintaxis y creí que correspondía a la forma de pasar y llamar el hash.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Pasar varios hash desde subrutina

Notapor explorer » 2009-11-10 03:26 @185

Una buena forma de evitar este error es seguir la recomendación indicada en el capítulo 3 del libro Perl Best Practices, sección Reference Variables: agregar el sufijo '_ref' a las variables escalares que almacenan referencias:

my $hash_ref;

De esa manera, resulta más visible los errores de escritura:

print $hash_ref{clave};

Debería ser...

print $hash_ref->{clave};

Como nota graciosa, esta es la única recomendación de estilo de escritura de notación Húngara de todo el libro. :)
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados