Vie Jul 11, 2008 4:29 pm
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 115
|
|
| Combinar dos arrays |
|
|
Bueno lo que necesito hacer es algo muy sencillo, pero al mismo tiempo no doy con la solución.
Tengo dos array:
| Perl: | my @animales = ('perro', 'gato', 'gallina', 'tortuga', 'salmon', 'caballo', 'burro', 'leon', 'buitre', 'camaleon', 'loro', 'mono', 'piraña');
my @color = ('rojo', 'gris', 'verde', 'azul'); |
Lo que trato de hacer es construir un nuevo array, de forma que el primer elemento de @animales se combine con el primer elemento del array @color, de forma que queda 'perro rojo', después que el segundo elemento de @animales se combinen con el segundo de @color y así sucesivamente...
| Código: |
perro rojo
gato gris
gallina verde
tortuga azul
#Y ahora se terminaron los elementos de @color, que vuelta a empezar.
salmon rojo
caballo gris
burro verde
leon azul
#Y otra vez a empezar.....
buiter rojo
...... |
En principio @animales tiene más elementos que @color, pero se pudiera dar el caso de que no. Entonces se combinaría únicamente los animales que hubiese, es decir lo que me marca que ya finalicé es tener todos los elementos de @animales combinados.
Perdón por la explicación, a ver si alguien me puede echar una mano o darme una idea de cómo puedo conseguir esto.
Gracias de antemano. Saludos. |
|
|
|

Vie Jul 11, 2008 5:45 pm
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 115
|
|
|
|
|
Bueno... hice un apaño.
| Perl: | #!/usr/bin/perl -w
use strict;
my @animales = ('perro', 'gato', 'gallina', 'tortuga', 'salmon', 'caballo', 'burro', 'leon', 'buitre', 'camaleon', 'loro', 'mono', 'piraña');
my @color = ('rojo', 'gris', 'verde', 'azul');
my $cposicion = my $pposicion = 0;
my $c_fin = scalar(@animales);
my $p_fin = scalar(@color);
my @combination;
while ($cposicion != $c_fin) {
if ($pposicion == $p_fin) {
$pposicion = 0;
}
push (@combination, $animales[$cposicion]. "-->". $color[$pposicion]. "\n");
$pposicion++;
$cposicion++;
}
print @combination; |
Creo que no tiene ninguna pega el código.  |
|

Vie Jul 11, 2008 8:38 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3841
Ubicación: Valladolid, España
|
|
|
|
|
Si el código te funciona, no hay ninguna pega.
Esta es mi solución:
| Perl: | #!/usr/bin/perl
use strict;
use warnings;
my @animales = qw(
perro gato gallina
tortuga salmon caballo
burro leon buitre
camaleon loro mono
piraña
);
my @colores = qw( rojo gris verde azul );
if ( @animales > @colores ) {
@colores = (@colores) x (1 + @animales / @colores);
$ #colores = $#animales;
}
my @combination = map { "$animales[$_]-->$colores[$_]" } 0 .. $ #animales;
print "@combination\n"; |
El truco que he usado es hacer que los dos array tengan la misma longitud (el mismo número de elementos), para que al map() final le sea fácil extraer los elementos.
Para conseguir que los dos arrays tengan el mismo número de elementos, primero comprobamos que, efectivamente, tengamos más @animales que @colores. Si es así, entonces asignamos un nuevo contenido a @colores, que será el propio @colores repetido (x) tantas veces como la división entera entre el número de @animales por el de @colores, más 1.
Con este cálculo conseguimos que los colores se vayan repitiendo uno detrás de otro, tantas veces como divisor sea @colores de @animales. Como la división casi nunca es exacta, le sumamos 1 para al menos tener un exceso de @colores (tendremos que el número de @colores excede al de @animales).
La siguiente línea se encarga de recortar ese posible exceso. Igualamos longitudes de los dos array.
Y ya está, solo queda map()earlos al nuevo aspecto que queramos; y meterlos en el nuevo array.
Naturalmente, hay muchas más soluciones... |
|

Sab Jul 12, 2008 5:32 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3841
Ubicación: Valladolid, España
|
|
|
|
|
Después de 8 horas de sueño, te das cuenta de que las cosas sencillas son las mejores...
| Perl: | #!/usr/bin/perl
use strict;
use warnings;
my @animales = qw(
perro gato gallina
tortuga salmon caballo
burro leon buitre
camaleon loro mono
piraña
);
my @colores = qw( rojo gris verde azul );
my @combination = map { "$animales[$_]-->$colores[$_ % @colores]" } 0 .. $ #animales;
print "@combination\n"; |
|
|
Dom Jul 13, 2008 5:37 am
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 115
|
|
|
|
|
Jajaja, perfecto, explorer, gracias por la solución.
Muy sencilla, sin duda.
Saludos. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|