[Programación] Re: [Programación] Seguirmos con el perl,,,,

Nicolás Aimetti programacion@lugro.org.ar
Fri, 09 Dec 2005 14:55:16 +0000


Hola...


> Una última dudilla,,, como hago para crear el arreglo
> de registros y que la dimensión se me actualice
> dinámicamente... 

Bien no entendí la pregunta, o por ahí si... usted dirá...
Acá incluyo un ejemplo que juega bastante con el tema de arreglos y 
matrices... calculo que en alguno de los puntos debe estar respondida la 
  pregunta, esperemos que haya suerte.


#!/usr/bin/perl -w

use strict;
# tenemos la siguiente matriz por ejemplo:
#     | 0 1 2 |
#     | 8 9 4 |
# M = | 4 5 7 |
#     | 3 4 6 |

# En perl la representamos mediante un arreglo que contiene cuantro 
referencias a otros
# arreglos de tres elementos (o sea, el arreglo principal contiene los 
renglones)
# (tambien podría ser un arreglo que contengo 3 referencias a otros 
arreglos de 4 elementos,
#  depende lo que vaya a hacerce combiene una u otra)

my @M = (
         [ 0, 1, 2 ],
         [ 8, 9, 4 ],
         [ 4, 5, 7 ],
         [ 3, 4, 6 ],
);

#perl no permite anidar estructuras complejas, o sea, a difencia los 
leguajes
#funcionales que permiterian escribir la estructura anterior de la forma 
más intuitiva:
# M = (
#       (0,1,2) ,
#       (8,9,4 )
#       etc...
# )
#
# en perl los ARRAYS y los HASH deben contener datos escalares, y las 
referencias lo son.
# En este sentido es más parecido a C.

#A los corchetes [ ] que contienen a los valores 0, 1, 2 se los puede 
pensar como un constructor
#que devulven referencias a arrays anonimos.
#si uno no usase arrays anonimos debería hacer algo de está forma:
#
my @renglon1 = (0,1,2);
my @renglon2 = (8,9,2);
my @M1 = (
         \@renglon1,
         \@renglon2,
         #etc...
);

#varias formas de agregar un renglon a M1

push @M1, [ 4, 5, 7 ];
$M1[3] = [ 3, 4, 6 ];

#ahora M y M1 son iguales...

print "A = (\n";
print "\t",join(',',@$_),$/  for @M ;
print ")\n";

print "A = (\n";
print "\t",join(',',@$_),$/  for @M1 ;
print ")\n";

#modificamos el elemento 2,1 (contando de cero, los renglones primero,
# como las matrices en matematica), era un 5 ahora lo hacemos 7

$M[2]->[1] = 7;

#modificamos el elemento 2,0, pero usando otra syntaxis:

${$M[2]}[0] = 7;


print "A = (\n";
print "\t",join(',',@$_),$/  for @M ;
print ")\n";

# a gregamos una columna seteada a 1 a la matriz..

foreach my $row( @M ){
         # $row es una referecia a un array... la desrefereciamos con el 
@ adelante
         push @$row, 1;
         #push @{$row}, 1; tambien se puede escribir as'i
}


print "A = (\n";
print "\t",join(',',@$_),$/  for @M ;
print ")\n";

#ahora agregamos un columna con  2 y modificamos la primer columna para 
que sea
#igual al indice del renglon
#uso otra syntaxis...

my $largo_de_M = scalar @{$M[0]};
for(my $i=0 ;$i < @M; $i++){
         $M[$i]->[0] = $i;
         $M[$i]->[$largo_de_M] = 2;
}

print "M = (\n";
print "\t",join(',',@$_),$/  for @M ;
print ")\n";

#M luego de las modificaciones...
#M = (
#   0,1,2,1,2
#   1,9,4,1,2
#   2,7,7,1,2
#   3,4,6,1,2

_END_

Saludos,
        Nicolás.