• Publicidad

Combinar dos arrays

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

Combinar dos arrays

Notapor Zeokat » 2008-07-11 17:29 @770

Bueno lo que necesito hacer es algo muy sencillo, pero al mismo tiempo no doy con la solución.

Tengo dos array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @animales = ('perro', 'gato', 'gallina', 'tortuga', 'salmon', 'caballo', 'burro', 'leon', 'buitre', 'camaleon', 'loro', 'mono', 'piraña');

my @color = ('rojo', 'gris', 'verde', 'azul');
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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: Seleccionar todo
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.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor Zeokat » 2008-07-11 18:45 @823

Bueno... hice un apaño.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Creo que no tiene ninguna pega el código. :D
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-07-11 21:38 @943

Si el código te funciona, no hay ninguna pega.

Esta es mi solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2008-07-12 06:32 @314

Después de 8 horas de sueño, te das cuenta de que las cosas sencillas son las mejores...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-07-13 06:37 @317

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

Muy sencilla, sin duda.

Saludos.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380


Volver a Básico

¿Quién está conectado?

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

cron