sábado, octubre 28, 2006

Guía del Lenguaje Perl – 4ta parte

Arreglos Asociativos

Se caracterizan por que se puede definir cualquier tipo de dato escalar como índice. El caracter $ se utiliza para refererirse a un elemento escalar y el caracter % para todos. Para asignar valores a un arreglo asociativo, se utilizan las llaves ({ }) alrededor de la clave de índice. Para referirse a un arreglo asociativo en su totalidad, se usa su nombre precedido del símbolo "%"; si por el contrario se desea acceder solamente a un elemento se usa el nombre del arreglo anteponiendo el símbolo "$". Si lo que se quiere es manipular las llaves o los valores se usa el símbolo "@" antes del nombre.

Sobre los arreglos asociativos se se realizan tres operaciones principales:

- obtener el valor asociado a una clave
- cambiar el valor asociado a una clave.
- verificar si una clave existe.



En el siguiente ejemplo se define un arreglo asociativo llamado stock con sus pares de clave-valor,

%stock = (limones => 6, peras => 3, uvas => 2);

A la estructura anterior se le pueden agregar ó modificar pares clave-valor de la siguiente forma


$stock{peras} = 9;
$stock{bananas} = 4;


Una forma de crear un arreglo asociativo es a partir de pares de datos clave-valor leidos de un archivo

Ejemplo:

open FILE, "frutas.txt" or die(“Error $!”);

while ([FILE]){
$linea = chomp($_); se elimina el fin de linea
@tmp = split(/\t/); # se separa el registo en campos
# (el tabulador es el delimitador)

$stock{$tmp[0]} = $tmp[1]; # se asigna par clave-valor
}
close FILE or die(“Error $!”);


Un par clave-valor se borra con

delete $stock{uvas};

Un arreglo completo se borra

undef %stock;

Para eliminar todas los pares claves-valor, pero no la estructura, se utiliza

%stock = ();

Para navegar una estructura se pueden utilizar varias formas. La instruccion foreach
permite recorrer la estructura de forma completa. La variable $clave se instancia con el valor de la clave.

foreach $clave (keys %stock) {
print "$clave = $stock{$clave}\n";
}


También con el elemento map, es posible listar las claves.

print map "$_ = $stock{$_}\n", keys %stock;


Se puede utilizar while y each para leer una arreglo asociativo

while (($key,$valor) = each %stock){ print "$key = $valor\n"; }


La función keys crea un arreglo indexado con las claves de un arreglo asociativo

%a = ( x => 5, y => 3, z => 'abc' );
@b = keys %a # @b se instancia con ( 'x', 'y', 'z');


La función values devuelve un arreglo indexado con los valores de arreglo asociativo

%a = ( x => 5, y => 3, z => 'abc' );
@v = values %a # @v se instancia con con ( 5, 3, 'abc' );


La función exists prueba si existe una clave en un arreglo asociativo

%a = ( x => 5, y => 3, z => 'abc' );
$b = exists $a{z}; # $b se instancia con 1, es verdadero
$c = exists $a{w}; # $c queda con "", es falso


Es posible ordenar una estructura. Para Perl existen tres formas: por orden ASCII, numericamente o alfabeticamente.

%hash = (Apples=>1, apples=>4, artichokes=>3,Beets=> 9,);
foreach my $key (sort keys %hash) { print "$key = $hash{$key}\n"; }


La salida será

Apples = 1
Beets = 9
apples = 4
artichokes = 3


A los efectos ordenar alfabéticamente se puede utilizar la función lc (convertir a minúsculas) y el operador de comparación cmp.

foreach my $key (sort {lc($a) cmp lc($b)} keys %hash) {
print "$key = $hash{$key}\n";
}

No hay comentarios.: