• Publicidad

Pasar arrays entre funciones

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

Pasar arrays entre funciones

Notapor Statyk » 2005-06-11 18:25 @809

Buenas,

Quiero pasar arrays entre funciones. Estoy llamando a la función así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $resultado = funcion(@array1, @array2);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿Cómo podría recoger esos arrays desde funcion()?

He probado con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @tmp1 = shift;
  2. my @tmp2 = shift;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero no funciona.. ¿Cómo podría solucionarlo?

¡¡Saludos!!
Statyk
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2005-06-05 17:12 @758

Publicidad

Notapor Perl user » 2005-06-11 19:00 @833

Necesitas pasar referencias, ya que @_ recibirá todo en una sola lista.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $resultado = funcion( \@array1, \@array2);
  2.  
  3. sub funcion {
  4.    my @array1 = @{+shift}; # @{$_[0]};
  5.    my @array2 = @{+shift}; # @{$_[1]};
  6.    ....
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en perldoc perlvar

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor kidd » 2005-06-11 19:26 @851

Hola:

Una pregunta rápida, Marco. En la respuesta que pones:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @array1 = @{+shift};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿A qué se debe el + antes del shift?


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Perl user » 2005-06-11 22:06 @963

Normalmente vas a utilizar algún signo/símbolo para evaluar "algo" en forma de expresión. En este caso, si no pones el +, la palabra "shift" te la tomará como bareword... y obviamente te provocará errores. Simplemente pude haber puesto shift() y punto, pero +shift también es válido.

Este tipo de nomenclatura es generalmente usada donde definitivamente el uso de {} puede ser muy ambiguo para construir una expresión, por ejemplo en el caso de map. map tiene 2 modos, modo bloque y modo expresión. Imagina este caso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @ret = map { $_ => 1 } @arr;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí map es evaluado en modo BLOCK, ya que { } eso significa, pero también sabemos que {} son constructores de hashes anónimos, cuyo caso de este ejemplo es lo que queremos construir, un hashref. Por lo tanto, es necesario eliminar esa ambigüedad indicándole al compilador/interprete que evalúe eso como una expresión de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @ret = map +{ $_ => 1 }, @arr;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ahora sí... map nos regresará un array de hashrefs.

Pruébalo tú mismo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. require Data::Dumper;
  2. print Data::Dumper::Dumper( map { $_ => 1 } ( 1, 2, 3, 5, 6 ) );
  3. print Data::Dumper::Dumper( map +{ $_ => 1 },  ( 1, 2, 3, 4, 5, 6) );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos,

Mas referencias en: Effective Perl Programming, editorial Addison Wesley, Autores Joseph N. Hall y Randal L Schwartz.
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor Statyk » 2005-06-12 05:26 @268

¡Buenas!

Gracias a todos por las respuestas.

Otra pregunta, ¿qué es un "bareword"? Muchas gracias :-)
Statyk
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2005-06-05 17:12 @758

Notapor kidd » 2005-06-12 08:02 @376

Hola:

Al decir bareword se refiere cuando el intérprete de Perl toma una palabra como "palabra" en sí, no como una función o nada. Por ejemplo, siguiendo el mismo caso, si haces:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $Hash{shift} = "2";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En este caso la palabra shift la toma como una palabra en sí, no como la función shift() de Perl, cosa que no pasa cuando haces lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $var = shift;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Espero que me haya explicado bien.

SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Statyk » 2005-06-12 08:10 @382

Gracias, kidd,

Ha quedado perfectamente explicado ;-)

¡Saludos!
Statyk
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2005-06-05 17:12 @758


Volver a Básico

¿Quién está conectado?

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