2010-11-04 27 views
1

我有一個很大的數組,我想從數組中刪除第2,第8,第14等元素。我的陣列目前是這樣的:如何從Perl數組中刪除元素?

Element1 x A B C 
Element 2 y A B C 
Element 3 z A B C 

廣義上說,我要刪除的X,Y和Z(只是作爲一個例子,我的陣列是性能稍微更復雜)。然後拉起其餘的。如同,我不想在他們的職位上留下空白。我想:

Element 1 A B C 
Element 2 A B C 
Element 3 A B C 

我想試試這個跟我的數組「todelete」:

print "#Before Deleting"; print 
$todelete[0]; print "\n"; print 
$todelete[2]; print "\n"; print 
$todelete[3]; 

for ($count=2; $count<@todelete; 
$count=$count+6) { delete 
$todelete[$count]; } 

print "#After Deleting"; print 
$todelete[0]; print "\n"; print 
$todelete[2]; print "\n"; print 
$todelete[3];$todelete[3]; 

但是,目前,我認爲它只是unitializes我的價值,因爲當我打印結果,它告訴我:

Use of uninitialized value in print 

建議?

回答

5

你想要的功能是splice

+0

你的厲害!非常感謝! – poutine 2010-11-04 21:53:45

+3

@poutine:有人很驚奇,因爲他們已經閱讀[perl的每個安裝程序附帶的基本文檔](http://perldoc.perl.org/functions/splice.html)?是不是設置酒吧有點低? – Ether 2010-11-04 22:30:20

+0

啊......但現在我面臨另一個問題,因爲索引已經轉移。我需要刪除的元素不再位於第8個位置。它現在位於第7個位置。其餘部分也是如此。我認爲更好的選擇是刪除元素,然後使用過濾器,然後拼接出來? 以太......你的權利。在短時間內,當我認爲它工作時,我感到很驚訝,因爲我花了很多時間試圖用for循環來考慮它。 – poutine 2010-11-04 23:06:42

2

delete $array[$index]與調用$array[$index] = undef相同;它在你的數組中留下一個空白空間。爲了您的具體問題,怎麼樣像

@array = @array[ grep { $_ % 6 != 2 } 0 .. $#array ]; 
+0

數組上的'delete'已過時 - 另一個不使用它的好理由。 – daotoad 2010-11-05 15:53:44

2

您還可以使用grep作爲過濾器:

my $cnt = 0; @todelete = grep { ++$cnt % 6 != 2 } @todelete;