• Publicidad

¿Cómo introducir un hash como argumento en una subrutina?

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

¿Cómo introducir un hash como argumento en una subrutina?

Notapor anush » 2009-12-31 07:19 @346

Quiero usar un hash ya hecho en una subrutina, ¿podría introducirlo como argumento?, no quiero modificarlo ni nada, solo partir de él. Gracias.
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Publicidad

Re: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor explorer » 2009-12-31 09:20 @430

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %hash = (a => 1, b => 2);

subrutina1(\%hash);             # Pasamos el %hash como una referencia a él, no sus valores
subrutina2(\%hash);
subrutina3( %hash);             # ¡Ag! pasamos todos los valores del %hash (ineficiente)

sub subrutina1 {
    my $hash_ref = $_[0];       # Le estamos pasando una referencia a la subrutina

    print $hash_ref->{b}, "\n"; # El acceso es directo a nuestro %hash, des-referenciando con '->'
}

sub subrutina2 {
    my $hash = %{$_[0]};        # Hacemos una copia local del hash pasado por referencia (ineficiente)

    print $hash{b}, "\n";       # El acceso es directo, pero no es el mismo %hash que el nuestro
}

sub subrutina3 {
    my %hash = @_;              # Hacemos una copia local del hash pasado por valores (ineficiente)

    print $hash{b}, "\n";       # El acceso es directo, pero no es el mismo %hash que el nuestro
}
Coloreado en 0.002 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: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor anush » 2009-12-31 10:29 @478

Gracias, el hecho es que si en la subrutina quiero:
- Introducir una variable
- Introducir el hash
- Ver si esa variable está como clave en el hash y devolverme su valor

No veo cómo podría hacerlo con lo antes indicado.
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor explorer » 2009-12-31 10:36 @483

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %hash  = (a => 1, b => 2);
my $clave = 'b';

subrutina1($clave, \%hash);

sub subrutina1 {
    my $clave    = shift;       # Leemos los argumentos. Dos escalares. El primero es la $clave
    my $hash_ref = shift;       # El segundo es la referencia al %hash

    if ($hash_ref->{$clave}) {  # ¿Existe $clave como clave dentro del %hash?
        print "SI\n";
    }
    else {
        print "NO\n";
    }
}
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: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor anush » 2009-12-31 10:48 @491

¿Qué función tendría en este caso el shift()? ¿Almacenarlos al igual que hace @_?
Última edición por explorer el 2009-12-31 10:50 @493, editado 1 vez en total
Razón: Ortografía
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor explorer » 2009-12-31 10:58 @498

perldoc -f shift

shift()

shift() extrae el primer elemento del array o lista de valores, por la izquierda. Si no se dice nada, lo hace desde @_. Así que es la forma de leer argumentos pasados a las subrutinas.

Otra forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub subrutina1 {
    my $clave    = $_[0];       # Leemos los argumentos. Dos escalares. El primero es la $clave
    my $hash_ref = $_[1];       # El segundo es la referencia al %hash
#...
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: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor anush » 2009-12-31 11:03 @502

Creo que lo entendí, gracias.
Por último, si tengo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my @claves = keys %codigonuevo;
    my @valores = values %codigonuevo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Cómo pudo crear un hash partiendo de esos dos arrays?
Gracias =)
Última edición por explorer el 2009-12-31 11:36 @525, editado 1 vez en total
Razón: Ortografía
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor salva » 2009-12-31 11:33 @523

Así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %h;
@h{@claves} = @valores;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


fíjate en que aunque %h es un hash, cuando hacemos la asignación, cambiamos el % por una @ para indicarle a Perl que no nos referimos a una única entrada del hash sino a una lista de ellas.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor explorer » 2009-12-31 11:51 @535

Si tenemos
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my @claves  = keys   %codigonuevo;
    my @valores = values %codigonuevo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

entonces
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my %nuevo_hash = %codigonuevo;
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: ¿Cómo introducir un hash como argumento en una subrutina?

Notapor anush » 2009-12-31 12:29 @561

Intenté ponerme a prueba y al final me salió esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub subrutina{
    my($claves,$valores,$elemento) = @_ ;
    my @claves = @$claves;
    my @valores = @$valores;
    my %codigonuevo;
    my $i;
    for($i=0;$i< scalar(@claves);++$i) {
        $codigonuevo{$claves[$i]} = $valores[$i];
    }
    #...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es un poco más largo y rudimentario, pero funciona con las cosas que se hacer :)
Gracias. Al final utilicé esto en cierta manera para poder introducir un hash en una subrutina con mis posibilidades, es decir, mediante el paso por referencia de un array, que lo conozco.
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Siguiente

Volver a Básico

¿Quién está conectado?

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