[l-desarrollo] Anular una función en Perl

Ernesto Hernandez-Novich emhn at telcel.net.ve
Mon Apr 7 09:47:43 CDT 2003


On Mon, 7 Apr 2003, Alejandro Imass wrote:
> Quiero redefinir un mitodo (funcisn, sub) que ha sido inclumdo mediante
> require. Hay que tomar en cuenta que es un pl y no un pm por lo que no
> se puede usar use y excluir los mitodos con !

Un método es diferente a una función/subrutina. Un método está asociado
a un espacio de nombres _diferente_ al del programa principal.

> El script comienza asm:
>
> require "$form->{path}/io.pl";
> #undef &print_options;

Un require es semánticamente equivalente a un #include. ¿Cómo harías en
C? para "tapar" fopen() con tu propio fopen() si tienes un

#include <stdio.h>?

Exacto, no puedes a menos que quites stdio.h.

> sub print_options {
> ...
>
> }
>
> El problema es que print_options ya esta definido en io.pl y yo quiero
> anular este mitodo por el que estoy redefiniendo localmente en el script.

No es un método a menos que venga en un package.

Para poder hacer importado selectivo de nombres de un espacio a otro, es
obligatorio tener un package definido y cargarlo con use; es más, es
conveniente que el package sea un Exporter.

No obstante... y de una manera vomitiva y por demás destructiva de todo
lo que es bueno y hermoso acerca de la programación, puedes hacer esto

En p.pl

#!/usr/bin/perl
sub foo {
  print "Foo!\n";
}
return 42;

y en m.pl

#!/usr/bin/perl
require "p.pl";
sub bar {
  print "Bar!\n";
}
foo();                 # Imprime Foo! por p.pl
{
  local *foo = \&bar;  # Masajeas el espacio de nombres
  foo();               # Imprime Bar! por m.pl
}
foo();                 # Imprime Foo! nuevamente por p.pl
*foo = \&bar;          # Masajeas el espacio de nombres y pierdes foo
foo();                 # Imprime Bar! nuevamente por m.pl

Y en efecto "tapaste" foo de p.pl con bar de m.pl; no necesariamente de
forma "irrecuperable", porque siempre puedes hacer un bloque anónimo con
localización del nombre como ilustre en la segunda parte del programa.

Ahora bien, esto es una _asquerosidad_ y estoy preparado para negar en
una corte que sugerí tal proceder; y si alguien presenta este mensaje
como evidencia aduciré demencia temporal producto de tener que
interactuar con programadores de Visual Basic <g>.
-- 
Ernesto Hernández-Novich - Running Linux 2.4.19 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
¿Sabe leer? Elimine mi firma de sus respuestas; sé quién soy ;)

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list