Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Combinar dos arrays

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Vie Jul 11, 2008 4:29 pm
Zeokat
Perlero Frecuente
Perlero Frecuente
Registrado: 22 Ago 2006
Mensajes: 115
Combinar dos arrays Responder citando

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.
Mensaje Vie Jul 11, 2008 5:45 pm
Zeokat
Perlero Frecuente
Perlero Frecuente
Registrado: 22 Ago 2006
Mensajes: 115
Responder citando

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. Very Happy
Mensaje Vie Jul 11, 2008 8:38 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3915
Ubicación: Valladolid, España
Responder citando

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...
Mensaje Sab Jul 12, 2008 5:32 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3915
Ubicación: Valladolid, España
Responder citando

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";
Mensaje Dom Jul 13, 2008 5:37 am
Zeokat
Perlero Frecuente
Perlero Frecuente
Registrado: 22 Ago 2006
Mensajes: 115
Responder citando

Jajaja, perfecto, explorer, gracias por la solución.

Muy sencilla, sin duda.

Saludos.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group