2013-10-22 93 views
1

我有一個數組@k。我想創建一個新的數組@j,它可以複製@k內容但不包含第n個元素。從陣列中刪除元素知道其索引

E.g.我有@k=(1,1,1,3,4);我想這@j擁有所有@k的元素,但不是k[2],即@j=(1,1,3,4);

@j=grep {$k[$_] != $k[$selectedIndex]} @k;嘗試,但在這一點,將選擇陣列的價值,而不是他的索引。

回答

2

您可以使用數組切片僅取你想要的元素,

my @j = @k[0,1,3,4]; 

,或者使用類似的方法來過濾掉已知元素,

my $selectedIndex = 2; 
my @j = @k[ grep { $_ != $selectedIndex } 0..$#k ]; 
+0

但是,我必須刪除索引並不總是相同的。我必須儘可能使它更通用 –

+0

但它不是可定製的,可能有另一種方式來做到這一點。 – Lompa

+0

@ ValerioD.Ciotti你是否存儲過某些應該過濾的元素或指示? –

7

使用splice

my @j = @k; 
my $idx = 2; 
splice @j, $idx, 1; 
1

試試這個「快」的解決方案

@k = (2,4,6,8,10); 

$index_that_i_dont_want = 2; 
@j =(); 
$k_size = @k; 
foreach $i (0..$k_size) { 
    push (@j, $k[$i]) if($i != $index_that_i_dont_want); 
} 
#checks if it's right 
foreach $val (@j) { 
    print "$val\n"; 
} 
+0

更好地克里斯的拼接解決方案:) – Lompa

+3

'$ k_size = @ k'應該是'$ k_size = $#k',以確保我們遍歷正確數量的索引。 – Chris

+0

是真的,我的錯誤:) – Lompa