[Perl] Re: problemas hash (Sergi -)
Marco Antonio Manzo
amnesiac en unixmonkeys.com
Mie Nov 30 22:02:48 CST 2005
On Wed, 2005-11-30 at 17:34 -0600, Antonio Galicia wrote:
> Gunnar Wolf wrote:
>
> >>>nombre:direcciondecorreo
> >>>nombre2:direcciondecorreo2
> >>>nombre3:direcciondecorreo3
>
> >>while ( <ARCH> ) {
> >> $tu_hash{[split /:/, $linea]->[0]} = [split /:/, $linea]->[1];
> >>}
> >
>
> > Umh... Estás repitiendo una expresión regular, lo cual es chamba
> > gratis - ¿Por qué no mejor esto? (le agrego un siempre útil chomp)
>
> > O más fácil aún:
> >
> > %hash = map {chomp; /(.*):(.*)/; $1,$2} <ARCH>
>
> Pero dado que pregunta por el split sería:
>
> %hash = map {chomp; split /:/} <ARCH>
>
> lo cual es todo menos didáctico ;)
En lo personal ninguna de las 2 primeras solucines son eficientes, y no
cumplen con propósitos didácticos...
- El primero de ellos hace 2 splits, por qué tiene que usar 2? solo por
hacerse en una línea? caray...
- La segunda hace uso de una expresión regular Y NO verificas si
satisfactoriamente se cumple que $1 y $2 están definidos? Ok en el
ejemplo el pone un formato estándar, pero nunca hay que dar por hecho lo
creemos que no sucederá. Aparte de que hay 3 expresiones en el map y
tiene el mismo fallo. Recuerda la Ley de Murphy.
Al final, la conclusión es:
1) Si usas un while para leer sobre el FH, entonces asigna el resultado
de split a un array y ese asígnalo al hash.
2) Si usas una función de alto orden como map, entonces, para este caso
tan sencillo verifica que lo puedas hacer en la cantidad menor de
expresiones posibles ( como fué expuesto al final ).
Por qué usar split y no la solución de expresiones regulares? Porque
split al no cortar sobre el patrón establecido asigna null, la expresión
regular si encuentra el patrón no asigna a las variables mágicas y por
lo tanto hacer uso de ellas sin validación previa marcaría error fatal
en tiempo de ejecución al no estar definidas.
Para el caso 1:
my %data;
while ( <$fh> ) {
chomp;
my @line = split /:/;
$data{$line[0]} = $line[1];
}
Para el caso 2:
my %data = map { chomp; split /:/ } <$fh>
Saludos,
--
Marco Antonio Manzo Bañuelos
amnesiac en unixmonkeys.com
http://www.unixmonkeys.com/amnesiac/
Más información sobre la lista de distribución Perl