• Publicidad

Nombre de función dinámica

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

Nombre de función dinámica

Notapor mariotux » 2009-03-01 19:01 @834

Buenas,

Tal vez intento hacer algo extraño en Perl pero busco esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use paquete;
$nombreFuncion = "paquete::laFuncion";

$nombreFuncion($parametro);


package paquete
sub laFuncion{
 .....
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Alguna idea? Gracias.

Salu2.
mariotux
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-02-28 08:37 @401

Publicidad

Notapor Sombrerero_Loco » 2009-03-02 10:43 @488

¡Hola!

Hasta donde yo sé (y que me corrijan si me equivoco), no sé puede hacer eso, ya que al llamar a la función que declaras en el use, le están pasando un parámetro a una subrutina (o librería más bien).

Solo te queda hacerlo llamando a la función o viendo qué valores te permite usar como "parámetros" de la librería que quieres usar.

Otra cosa sería que una variable la pasaras antes por una subrutina que hiciera sus cositas dentro y te la devolviera modificada, como por ejemplo una subrutina que te modificara las vocales acentuadas por las que son sin acento.

No sé si se ayuda mucho pero es lo que se :)

¡Saludos!

Edito: te pongo en tu código lo que creo que deberías de hacer:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use paquete;

parámetro que admite el paquete = parámetros

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aunque si lo que quieres que pase algo por una subrutina antes de irse a la siguiente línea del script, éste sería un ejemplo. Como ves, $label es igual a sé, que tiene acento, en la siguiente línea lo redirijo a una subrutina que me quita los acentos y lo devuelve a la siguiente línea.

No sé si esto es lo que nos comentas....

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$label = "sé";
$label = &ortografia($label);
print "$label\n";

sub ortografia {                                                                                                       
        my $label = $_[0];

        $label=~ tr/á/a/;
        $label=~ tr/é/e/;
        $label=~ tr/í/i/;
        $label=~ tr/ó/o/;
        $label=~ tr/ú/u/;
        $label=~ tr/ñ/n/;
        $label=~ tr/Á/A/;
        $label=~ tr/É/E/;
        $label=~ tr/Í/I/;
        $label=~ tr/Ó/O/;
        $label=~ tr/Ú/U/;
        $label=~ tr/Ñ/N/;


        return $label;

  }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

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

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

Sí que se puede hacer, pero hay que seguir bien la notación.

Primero, supongamos que estás definiendo el paquete y el programa principal en el mismo fichero. Si es así, se puede escribir esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

#########################################
package paquete;
sub laFuncion {
    my $parametro = shift;
    print "Llamada a laFuncion con $parametro.\n";
}

#########################################
package main;
my $nombreFuncion = "paquete::laFuncion";

no strict 'refs';
&$nombreFuncion('Primera');
$nombreFuncion->('Segunda');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Como ves, hay dos formas de escribir la llamada a la función.

En el caso de que paquete vaya escrito en su propio fichero (paquete.pm), entonces lo escribimos así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
package paquete;

sub laFuncion{
    my $parametro = shift;
    print "Llamada a laFuncion con $parametro.\n";
}

1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Atención al "1" final. Es necesario que los módulos terminen con una sentencia verdadera.

En el programa principal, ponemos la línea use paquete; y tenemos el mismo resultado.
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

Notapor explorer » 2009-03-03 06:38 @318

Sombrerero_Loco escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$label = "sé";
$label = &ortografia($label);
print "$label\n";

sub ortografia {
        my $label = $_[0];

        $label=~ tr/á/a/;
        $label=~ tr/é/e/;
        $label=~ tr/í/i/;
        $label=~ tr/ó/o/;
        $label=~ tr/ú/u/;
        $label=~ tr/ñ/n/;
        $label=~ tr/Á/A/;
        $label=~ tr/É/E/;
        $label=~ tr/Í/I/;
        $label=~ tr/Ó/O/;
        $label=~ tr/Ú/U/;
        $label=~ tr/Ñ/N/;

        return $label;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esto lo puedes escribir de forma más cómoda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub ortografia {
        my $label = shift;

        $label =~ tr/áéíóúñÁÉÍÓÚÑ/aeiounAEIOUN/;

        return $label;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
ya que tr/// traduce de uno a uno.

O mucho mejor:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        1 #!/usr/bin/perl
        2 use strict;
        3 use warnings;
        4 use diagnostics;
        5
        6 use open ':locale';      # equivale a use open ':utf8'; use open ':std';
        7
        8 use Text::Unaccent::PurePerl qw(unac_string);
        9
       10 use utf8;
       11 my $cadena = "Hola, aquí van unas letras: áéíóúäëïöüñÑç\n";
       12
       13 print $cadena;
       14 $cadena = unac_string($cadena);
       15 print $cadena;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esto requiere un poco de explicación:
  • Línea 6: indicamos que las entradas y salidas de los ficheros han de hacerse en la codificación del sistema. Observar que ese use equivale a dos use. En mi caso, como trabajo en una terminal con codificación utf8, debo indicarlo en el primero, y luego, en el segundo, con :std indico que las salidas/entradas estándar están también en esa codificación. Pero bueno, con el :locale lo tengo solucionado todo de golpe
  • Línea 8: cargamos un módulo que hace justo lo que queremos: quitar acentos
  • Línea 10. Como estoy trabajando en una terminal en utf8, los caracteres de la línea 11 están escritos de esa manera. Debo indicar a Perl que, efectivamente, este programa está codificado en formato utf8 (hay algunos caracteres así). Si no lo hiciera, Perl seguiría pensando que seguimos trabajando en codificación ISO-8859-1.
  • Lo que sigue es lo normal: asignar cadena de caracteres, filtrarla con la función unac_string() y pintar el resultado.
Hacerlo así tiene una gran ventaja: no tienes que recordar si se te ha olvidado algún carácter acentuado por filtrar.

En tu caso... te has olvidado de la 'ü' y de la 'ç'...

El resultado de este último programa es:
Código: Seleccionar todo
Hola, aquí van unas letras: áéíóúäëïöüñÑç
Hola, aqui van unas letras: aeiouaeiounNc
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

Notapor Sombrerero_Loco » 2009-03-03 07:06 @337

¡Qué grande eres!

:)
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor explorer » 2009-03-04 12:11 @549

Pues el caso es que ya estaba respondida... :)
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

Notapor Sombrerero_Loco » 2009-03-05 03:01 @167

¿Dónde estaba respondida? ¡Mí no entender!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor explorer » 2009-03-05 04:12 @216

Me refiero al tema de quitar acentos, que hay un hilo donde hablamos de ese tema, y por eso he puesto el enlace a él, por si tu o más gente quiere repasarlo.
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

Notapor Jenda » 2009-03-06 08:46 @407

Como explorer ha explicado, sí que se puede hacer eso, pero no se debe hacerlo. Si tienes que deshabilitar strict, es claro que haces algo que deberías hacer sólo si no hay ninguna otra opción. En este caso, como en los otros casos en que la gente trata de usar referencias simbólicas, se debe usar referencias normales. Así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
...
my $funcionRef = \&paquete::laFuncion;

&$funcionRef('Primera');
$funcionRef->('Segunda');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Es más seguro y más rápido.

Jenda
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Básico

¿Quién está conectado?

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