[Perl] Creacion de variables

Gunnar Wolf gwolf@campus.iztacala.unam.mx
Thu, 13 Dec 2001 17:16:22 -0600 (CST)


> Bueno, directo al grano..
> Tengo un archivo con una lista de nombres, p. ej.
>
> luis
> alberto
> raul
> pedro
> arturo
>
> Desde un programa en Perl, necesito abrir este archivo y crear un array
> asociativo con el nombre de cada uno de los nombres que aparecen en el
> archivo, es decir que debo tener los arreglos: %luis, %alberto, %raul,
> %pedro, %arturo
> Y se deben crear variables para c/u de los nombres que aparezcan en el
> archivo, de tal manera que si en el futuro se agregan mas nombres, el
> programa cree nuevas variables para cada nombre agregado.
> Intente hacer algo como:
>
> while(<archivo>) {
>     $'$_'{'$_'}=3D"algun valor";
> }
>
> Pero no funciona.
> =BFAlguien sabe como hacer esto?

Podr=EDas hacerlo con eval:

while (my $nombre=3D<FILE>) {
    chomp $nombre;
    eval("\$$nombre{$nombre}=3D'alg=FAn valor';");
}

te crear=EDa:

%pedro =3D ('pedro' =3D> 'alg=FAn valor');
%luis =3D ('luis' =3D> 'alg=FAn valor');
etc.

Ahora, esto definitivamente no es elegante, ni demasiado seguro. Te
sugiero m=E1s bien usar una estructura m=E1s profunda - Lo primero que se m=
e
ocurre es un hash de arrays o un hash de hashes, dependiendo de lo que
quieras. Y yendo un paso m=E1s adelante, hasta te sugiero que sea una
referencia a un hash de hashes - muchas veces es m=E1s f=E1cil manejar a la
estructura completa como una variable escalar que como una lista o un
hash. Algo as=ED:

my ($datos);
while (my $nombre=3D<FILE>) {
    chomp $nombre;
    if (quieres_hash_de_hashes) {
        $datos->{$nombre}{$nombre} =3D 'alg=FAn valor';
    } elsif (quieres_hash_de_arrays) {
        $datos->{$nombre}[0] =3D 'alg=FAn valor';
    } elsif (quieres_un_simple_hash) {
        $datos->{$nombre} =3D 'alg=FAn valor';
    } else {
        print "=BFPos qu=E9 fregaos quieres?\n";
    }
}

PD - Como muestro en la =FAltima opci=F3n - =BFPor qu=E9 no usas un hash se=
ncillo?

Saludos!

--
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118