Cuando importas funciones o métodos de otras bibliotecas, pasan a formar parte de tu "espacio de nombres", para poder usarlas, naturalmente, y no tener que referirse a ellas usando nombres largos, como paquete::funcion(). Quieres usar funcion(), y nada más. Pero eso lo que hace es "contaminar" tu propio espacio de nombres, haciéndose cada vez más grande.
Un ejemplo. Supongamos que tenemos este módulo:
Using perl Syntax Highlighting
package query;
sub new {
my $struct = {}; # almacén de información para todos los usuarios
bless $struct; # la bendecimos
return $struct; # y devolvemos
}
sub struct_user { # estructura para un único usuario
my $self = shift; # objeto con todo el almacén
# datos del usuario a guardar
my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
$self->{users}-> {$nick} = {
id => $id,
nickname => $nick,
ip => $ip,
modos => $modos,
realname => $realname,
identd => $identd,
timestamp => $timestamp
};
$self->{oldusers}->{$id} = {
nickname => $nick,
};
}
1;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Bueno, apenas tiene dos métodos. Si lo pasamos por el bucle, solo salen esos dos:
Using bash Syntax Highlighting
> perl -E 'use query; for(keys %query::) { print "$_\n" if exists &{"query::$_"} }'
struct_user
new
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Ahora le agregamos un módulo, List::Util, e importamos un montón de métodos, puede que los usemos o no, en el módulo:
Using perl Syntax Highlighting
package query;
use List::Util qw(first max maxstr min minstr reduce shuffle sum);
sub new {
my $struct = {}; # almacén de información para todos los usuarios
bless $struct; # la bendecimos
return $struct; # y devolvemos
}
sub struct_user { # estructura para un único usuario
my $self = shift; # objeto con todo el almacén
# datos del usuario a guardar
my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
$self->{users}-> {$nick} = {
id => $id,
nickname => $nick,
ip => $ip,
modos => $modos,
realname => $realname,
identd => $identd,
timestamp => $timestamp
};
$self->{oldusers}->{$id} = {
nickname => $nick,
};
my $x = first { defined $_ } (undef, undef, undef, 1, undef);
print $x;
}
1;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Usamos solo una vez la función 'first', pero hemos importado unas cuantas más:
Using bash Syntax Highlighting
> perl -E 'use query; for(keys %query::) { print "$_\n" if exists &{"query::$_"} }'
sum
minstr
max
struct_user
reduce
maxstr
min
first
shuffle
new
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Bueno, podemos hacer una cosa: cuando Perl haya terminado de compilar nuestro módulo, podemos decirle que "olvide" todas esas funciones importadas, y que se quede solo con las que hemos definido nosotros. Las funciones externas seguirán funcionando, pero ya no formarán parte del espacio de nombres de nuestro módulo.
Eso se consigue con los módulos
namespace::autoclean y
namespace::clean. Veámoslo:
Using perl Syntax Highlighting
package query;
use List::Util qw(first max maxstr min minstr reduce shuffle sum);
use namespace::autoclean;
sub new {
my $struct = {}; # almacén de información para todos los usuarios
bless $struct; # la bendecimos
return $struct; # y devolvemos
}
sub struct_user { # estructura para un único usuario
my $self = shift; # objeto con todo el almacén
# datos del usuario a guardar
my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
$self->{users}-> {$nick} = {
id => $id,
nickname => $nick,
ip => $ip,
modos => $modos,
realname => $realname,
identd => $identd,
timestamp => $timestamp
};
$self->{oldusers}->{$id} = {
nickname => $nick,
};
my $x = first { defined $_ } (undef, undef, undef, 1, undef);
print $x;
}
1;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Y ahora, la salida de los métodos definidos dentro será:
Using bash Syntax Highlighting
> perl -E 'use query; for(keys %query::) { print "$_\n" if exists &{"query::$_"} }'
new
struct_user
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Incluso funciona Class::Inspector:
Using bash Syntax Highlighting
> perl -E 'use query; use Class::Inspector; $ref = Class::Inspector->methods("query", "public", "full"); for (@$ref) { say }'
query::new
query::struct_user
> perl -E 'use query; use Class::Inspector; $ref = Class::Inspector->functions("query"); for (@$ref) { say $_ }'
new
struct_user
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Naturalmente, esto funciona para los módulos que escribamos nosotros. Si queremos hacer introspección de otros distintos, pues nos podemos encontrar con que los autores no hicieron esa limpieza.