2011-04-20 77 views
5

我需要使用Perl处理大量数据。 在某些点上,我需要在主数组中插入第二个数组的值。 我已经看到,拼接通常应该是要走的路。然而,经过一番研究,我发现这个功能是内存密集型的,随着时间的推移可能会导致严重的性能问题。将数组中的多个值插入到另一个数组中

这基本上就是我需要做的事情 -

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

现在,插入的@second内容为@primary在偏移4获得 - 用

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

会当我必须处理一个拥有超过2000个元素的主数组时,链表是最有效的方式吗?

注:谁能确认这是做

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

正确的方法是什么?

+9

不要做过早的优化。将它拼接起来,如果(不是当)引起问题,那么就开始寻找更深奥的解决方案 – Oesor 2011-04-20 15:20:30

回答

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

简短而甜美。 +1 – Axeman 2011-04-20 19:41:42

1

这是一个“正确”的方式来执行它insofaras它的工作。但是,这可能不是最直接的方式。

#!/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); 

这显示:

$ 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] 

这是你在找什么。即使在2k元素,你也许会发现这个Fast Enough(TM)。

+0

谢谢你。 另一个精度 - 我将处理坐标,将它们扩展到多边形缓冲区。这意味着对于2K坐标线,我会做2K次插入。 你觉得我们应该仍然可以表现吗? – Simon 2011-04-20 16:10:54

+0

@Simon是的,因为无论如何数组只能有标量(引用仍然是标量),所以你不移动对象或数组,只是移动引用。与往常一样,唯一确定的方法就是对其进行基准测试。 – Tanktalus 2011-04-20 19:11:33

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

这并不是你要求的那样做。有

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

而且

# 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]; 

我希望这只是一个抄写错误之间的一个重要区别,但它是值得的情况下,其他人试图复制你的代码指着这些东西。

而且,为了将来的参考,请将代码剪切并粘贴到Stack Overflow的问题中。如果你重新输入它,你有可能会弄错它,并会让那些试图帮助你的人感到困惑。