2011-04-20 29 views
5

Necesito procesar una gran cantidad de datos en matrices con Perl. En ciertos puntos, tendré que insertar los valores de una segunda matriz dentro de una matriz primaria. He visto que empalme normalmente debería ser el camino a seguir. Sin embargo, después de haber investigado un poco, he visto que esta función consume mucha memoria y con el tiempo podría causar un serio problema de rendimiento.Insertar varios valores de una matriz en otra matriz

Aquí es básicamente lo que estoy necesitando hacer -

# two arrays 
@primary = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
@second = [a, b, c, d e]; 

Ahora inserte el contenido de @second en @primary en desplazamiento 4 para obtener -

@primary = [1, 2, 3, 4, a, b, c, d, e, 5, 6, 7, 8, 9]; 

haría con las listas vinculadas son la manera más eficiente de hacerlo cuando tengo que manejar una matriz primaria que contiene más de 2000 elementos?

Nota: ¿alguien puede confirmar que esta es la forma correcta de hacerlo

$Tail = splice($primary, 4); 
push(@primary, @second, $Tail); 

?

+9

No realice una optimización prematura. Empalúelo, y si (no cuando) causa problemas, entonces comienza a buscar soluciones más esotéricas – Oesor

Respuesta

7
splice @primary, 4, 0, @second; 
+0

Corto y dulce. +1 – Axeman

1

Esa es una manera "correcta" de hacerlo en la medida en que funciona. Sin embargo, probablemente no sea la forma más directa.

#!/usr/bin/perl -l 

use Data::Dump qw(dump); 

my @pri = (1..9); 
my @sec = ('a'..'e'); 

print "pri = ", dump(\@pri); 
print "sec = ", dump(\@sec); 

splice @pri, 4, 0, @sec; ### answer 

print "now pri = ", dump(\@pri); 

Este muestra:

$ perl x.pl 
pri = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
sec = ["a", "b", "c", "d", "e"] 
now pri = [1, 2, 3, 4, "a", "b", "c", "d", "e", 5, 6, 7, 8, 9] 

que es lo que está buscando. Incluso con 2k elementos, probablemente encontrarás este Fast Enough (TM).

+0

Gracias por esto. Una precisión adicional: procesaré coordenadas y las expandiré a un buffer poligonal. Esto significa que para una línea de coordenadas de 2K, haré esta inserción 2K veces. ¿Siente que todavía deberíamos estar bien para el rendimiento? – Simon

+0

@Simon sí, porque las matrices solo pueden tener escalares de todos modos (una referencia sigue siendo un escalar), por lo que no está moviendo objetos o matrices, solo está moviendo referencias. Como siempre, la única forma de estar seguro es compararla. – Tanktalus

0
# two arrays 
@primary = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
@second = [a, b, c, d e]; 

Eso no está haciendo lo que usted dice que hace. Hay una diferencia importante entre

# Store a list of values in an array 
@primary = (1, 2, 3, 4, 5, 6, 7, 8, 9); 

Y

# Store a list of values in an anonymous array 
# Then store a reference to that array in another array 
@primary = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

espero que era sólo un error de transcripción, pero vale la pena señalar estas cosas a cabo en caso de que alguien intenta copiar el código.

Y, para referencia futura, corte y pegue el código en las preguntas en Stack Overflow. Si vuelves a escribir, existe la posibilidad de que te equivocas y confundas a las personas que intentan ayudarte.

Cuestiones relacionadas