Yo creo que lo estás complicando demasiado: no necesitas crear módulos para ir almacenando las URL que vas leyendo de los archivos. Todo eso lo puedes hacer desde el propio programa, metiéndolo todo en un único
hash.
El array especial @ISA muestra la relación padre-hijo entre nuestro módulo y otros. En tu caso, estás heredando las funciones y métodos del módulo Exporter (ver secciones "Perl Classes y Perl Modules" en tu propio ordenador en
perldoc perlmod,
y en la Web (
traducido al español)).
La variable $VERSION indica a la gente de fuera (otros programas y módulos) en qué versión está nuestro programa o módulo.
La variable @EXPORT_OK indica la relación de variables y funciones que, opcionalmente, otros programas y módulos pueden importar desde el nuestro.
Lo que las líneas 1 y 3 están haciendo es indicar que esto es un módulo del que podemos exportar una serie de variables y funciones, a otros programas y módulos, y así no es necesario poner el nombre completo para acceder a ellos.
Ejemplo, si en un programa ponemos
use SecIP qw(%lista);
entonces en ese programa podemos acceder a %lista de forma directa:
say $lista{$clave};
Si no lo hiciéramos así, estaríamos obligados a escribirlo así:
say $SecIP::lista{$clave};
my() y our() son dos funciones que declaran variables. my() declara variables en un ámbito léxico (local a un contexto), mientras que our() declara variables globales al paquete en donde nos encontremos. La diferencia entre los dos es que, mientras que my() declara nuevas variables, our() crea alias a variables globales preexistentes. Más información en
perldoc -f my y
perldoc -f our'$' es el sigilo de las variables escalares. '@' es el sigilo de las variables
array. '%' es el sigilo de las variables
hash. Más información en tu propio ordenador en
perldoc perldata,
y en la Web (
traducido al español).
Otro detalle: los '1' que aparecen repetidos en tu código.
Cuando Perl carga un módulo, lo ejecuta, por si resulta que dentro de él existe algún código de inicialización. Si, la última instrucción ejecutada dentro del módulo es 'verdadera', se dice entonces que la carga del módulo es correcta y se sigue adelante. Si no, se para con un error.
Como la mayoría de los módulos no tiene código de inicialización, o ese código no sabemos qué va a devolver o si no nos importa lo que haga, tenemos que asegurarnos que la carga del módulo devuelva siempre un valor 'verdadero'. Esa es la razón por la cual muchos módulos terminan con un '1;'. Como es una sentencia que se puede ejecutar, y estará hacia el final, estamos enviando ese valor 'verdadero' al módulo o programa que ha cargado nuestro módulo.
Por eso, en tu código... sobran todos los '1;', excepto el último
Otra forma, en lugar de usar módulos, es usar objetos:
Using perl Syntax Highlighting
#!/usr/bin/env perl
package SecIP;
use strict;
use warnings;
use autodie;
sub new {
my $clase = shift;
my $ruta = shift;
open my $URL, '<', $ruta;
my (@url) = <$URL>;
chomp(@url);
close $URL;
my %lista = map { $_ => 1 } @url;
my $self = \%lista;
bless $self, $clase;
return $self;
}
sub getNumeroElementos {
my $self = shift;
return scalar keys %{$self};
}
sub existeElemento {
my $self = shift;
my $elemento = shift;
return exists $self->{$elemento};
}
sub getHash {
my $self = shift;
return {%{$self}};
}
1;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
use Data::Dumper;
use SecIP;
for my $archivo (glob "lista*txt") {
my $secip = SecIP->new($archivo); # creamos un objeto
say $secip->getNumeroElementos(); # número de elementos leídos
my $hash_ref = $secip->getHash(); # obtenemos el hash construido
say Dumper $hash_ref; # lo volcamos en pantalla, para ver qué aspecto tiene
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Pero... para este problema, yo creo que no es necesario usar ni módulos ni objetos.