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 }