• Publicidad

Asignación dinámica de vectores

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Asignación dinámica de vectores

Notapor ignasificus » 2006-06-01 07:12 @342

Saludos, tengo una duda que espero podáis resolverme.
Quiero que los contenidos del vector @comida, sean asignados de manera automática a otros vectores, con cada alimento por separado, y para ello necesito que el nombre de los vectores se cree automáticamente del tipo "array0" "array1" .. etc

¿Qué me falla en este código?

Código: Seleccionar todo
#!/usr/bin/perl


@comida = ("fresa:manzana:pera", "lechuga:tomate:pimiento", "merluza:salmon:trucha");

foreach $alimentos (@comida)
{
   $indice = 0;
   $nombrevector = "array" . $indice;
   print "$nombrevector"; #Esto es una comprobacion
   @{$nombrevector} = split /:/, $comida;
   $indice++;
}

print "@array0\n";
print "@array2\n";


¡Gracias!
Avatar de Usuario
ignasificus
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-06-01 07:07 @338
Ubicación: Valencia

Publicidad

Notapor kidd » 2006-06-01 08:30 @396

Hola:

Yo lo que haría sería crear un hash en donde vamos a asignar referencias a nuestros vectores:

Código: Seleccionar todo
#!/usr/bin/perl

use warnings;
use strict;

my @comida = ("fresa:manzana:pera", "lechuga:tomate:pimiento", "merluza:salmon:trucha");

my %Vector;


my $indice = 0;

for my $alimentos (@comida){
   my @items = split /\:/, $alimentos;
   $Vector{$indice} = \@items;
   $indice++;
}

print @{$Vector{1}},"\n";
print @{$Vector{2}},"\n";




Como ves creamos un array @items, el cual lo asignamos a una llave $Vector, pero pasamos la referencia.

Ya después podemos llamar el array de-referenciando, eso se hace en la siguiente línea:

Código: Seleccionar todo
@{$Vector{1}}



Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

encontrado el fallo

Notapor explorer » 2006-06-01 11:31 @521

El fallo está en la línea del split. No debes dividir la $comida, sino los $alimentos. Y sacar el inicializador del $indice fuera del bucle.
Ahora sí que funciona:
Código: Seleccionar todo
    1 #!/usr/bin/perl
    2
    3 @comida = ("fresa:manzana:pera", "lechuga:tomate:pimiento", "merluza:salmon:trucha");
    4
    5 $indice = 0;
    6 foreach $alimentos (@comida)
    7 {
    8    $nombrevector = "array" . $indice;
    9    print "$nombrevector "; #Esto es una comprobacion
   10    @{$nombrevector} = split /:/, $alimentos;
   11    $indice++;
   12 }
   13 print "\n";
   14 print "@array0\n";
   15 print "@array2\n";

array0 array1 array2
fresa manzana pera
merluza salmon trucha


Esta es la versión "estricta" del problema:
Código: Seleccionar todo
    1 #!/usr/bin/perl -l
    2 use strict;
    3 use warnings;
    4 no strict 'refs';
    5
    6 our (@array0, @array1, @array2);
    7 my @comida = qw(
    8     fresa:manzana:pera
    9     lechuga:tomate:pimiento
   10     merluza:salmon:trucha
   11 );
   12
   13 my $i = 0;
   14 foreach my $alimento ( @comida ) {
   15    my $v = "array" . $i++;
   16    @$v = split ':', $alimento;
   17 }
   18
   19 print "@array0";
   20 print "@array2";
Es la misma que la tuya con los siguientes cambios:
* 1: Ponemos la opción -l para no tener que escribir "\n" en cada print (vagos que somos los perlistas).
* 2 a 4: Queremos que nos avise Perl de cualquier desvío del buen camino. A excepción del uso de variables con referencias simbólicas.
* 6: Por ser estrictos... vamos a crear nuestras (our) variables globales por adelantado.
* 15: Creamos el nombre de la variable simbólica. El contador $i se incrementa para la próxima vuelta, después. Me gustaría ver esto mismo en otros lenguajes...

No sería mucho más complicado tener arrays con nombres más apropiados:
Código: Seleccionar todo
    1 #!/usr/bin/perl -l
    2 use strict;
    3 use warnings;
    4 no strict 'refs';
    5
    6 my @comida = (
    7     [ fruta   => 'fresa:manzana:pera'      ],
    8     [ verdura => 'lechuga:tomate:pimiento' ],
    9     [ pescado => 'merluza:salmon:trucha'   ],
   10 );
   11 our ( @fruta, @verdura, @pescado );
   12
   13 foreach my $alimento ( @comida ) {
   14     my $tipo = $alimento->[0];
   15     @{ $tipo } = split ':', $alimento->[1];
   16 }
   17
   18 print "@fruta";
   19 print "@pescado";
* 7 a 9: El uso del separador '=>' nos ahorra tener que poner comas y entrecomillar los nombres de los tipos de alimentos.
* 14: El $tipo de alimento es el primer elemento de cada vector apuntado por $alimento.
* 15: Podíamos haber escrito así también: @$tipo.

Pero... ¿no nos estaremos liando demasiado? Es cierto que tenemos entonces los arrays que queremos, con sus nombres... pero también podemos hacer esto con los hash, como comentaba kidd. Aquí, otra solución, más de restaurante:
Código: Seleccionar todo
    1 #!/usr/bin/perl -l
    2 use strict;
    3 use warnings;
    4
    5 my %comida = (
    6     fruta   => [ qw( fresa manzana pera      ) ],
    7     verdura => [ qw( lechuga tomate pimiento ) ],
    8     pescado => [ qw( merluza salmon trucha   ) ],
    9 );
   10 print "Fruta:   @{$comida{fruta}}";   # Saca toda la fruta del cesto
   11 print "Pescado: $comida{pescado}[2]"; # Quiero el tercer plato de pescado
   12
   13 # Deme por favor el menú número 2:
   14 print "Menu 2:  ", join(' ', map { $comida{$_}[1] } keys %comida);
La línea 14 es lo mismo que esto:
14 print "Menu 2: ";
15 foreach my $tipo ( keys %comida ) {
16 print $comida{$tipo}[1];
17 }
Última edición por explorer el 2006-06-01 16:44 @739, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Asignación dinámica de vectores

Notapor Perl user » 2006-06-01 13:01 @584

ignasificus escribiste:Saludos, tengo una duda que espero podáis resolverme.
Quiero que los contenidos del vector @comida, sean asignados de manera automática a otros vectores, con cada alimento por separado, y para ello necesito que el nombre de los vectores se cree automáticamente del tipo "array0" "array1" .. etc

¿Qué me falla en este código?

Código: Seleccionar todo
#!/usr/bin/perl


@comida = ("fresa:manzana:pera", "lechuga:tomate:pimiento", "merluza:salmon:trucha");

foreach $alimentos (@comida)
{
   $indice = 0;
   $nombrevector = "array" . $indice;
   print "$nombrevector"; #Esto es una comprobacion
   @{$nombrevector} = split /:/, $comida;
   $indice++;
}

print "@array0\n";
print "@array2\n";


¡Gracias!


Perl user to the rescue :D

Código: Seleccionar todo
#!/usr/bin/perl

use strict;
use warnings;

my @comida = ( 'fresa:manzana:pera',
                         'lechuga:tomate:pimiento',
                         'merluza:salmon:trucha' );

my %arrays =
    map +( "array$_" => [ split /:/, $comida[$_] ] ), 0..$#comida;

# ahora %arrays contiene cada uno de los arrays especificados
# como "array0", "array1", etc.


Argh.... he comprendido que soy fanático de las funciones de alto orden :( Pero bueno, para eso existen, para hacernos la vida mas "fácil".

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Gracias¡

Notapor ignasificus » 2006-06-01 15:55 @705

Bua, pedazo de respuestas.
No esperaba tanta ayuda en tan poco tiempo, debéis de ser unos verdaderos perlfanáticos XD.
Me imprimiré todo esto, y me lo estudiaré más detenidamente, que ahora me pilla en plan perro. Estoy iniciándome en este lenguaje y hay cosillas que no comprendo, como tampoco sé cómo sacar el tamaño de un directorio, pero he estado googleando y he encontrado algunas cosas, las probaré y si me surje alguna duda, postearé, pero más adelante, ahora ya tengo material suficiente para ir probando cosillas.

¡Gracias de nuevo gente! :wink:
Avatar de Usuario
ignasificus
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-06-01 07:07 @338
Ubicación: Valencia


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados