2014-09-01 39 views
0

我有一個數組說操作數組:插入新元件在一定索引和換擋其它元件

my @array = (1,4,5,8);

上述陣列的每個元件可以或可以不具有一個孩子。

假設1有2,3個孩子,5個孩子有10個孩子。

我不得不操縱陣列,使得它成爲1,2,3,4,5,10,8


我在做什麼,在當前

foreach (@$children_indexes){ #myarray 
     foreach ($self->{RELATION}[$_]->{CHILDREN}){ #find the child of each index 
      push @$children_indexes, @$_; #I need to change this, as this is pushing at the end 
     } 
} 

回答

2

我猜$self->{RELATION}[$_]->{CHILDREN}是一個arrayref?

無論是通過您的由索引和向後索引的陣列循環:

for my $index_index (reverse 0..$#$children_indexes) { 
    if ($self->{RELATION}[$children_indexes->[$index_index]]{CHILDREN}) { 
     splice @$children_indexes, $index_index+1, 0, @{ $self->{RELATION}[$children_indexes->[$index_index]]{CHILDREN} }; 
    } 
} 

或使用圖:

my @array_with_children = map { $_, @{ $self->{RELATION}[$_]{CHILDREN} || [] } } @$children_indexes; 

(均假定...-> {兒童}將nonexist,或假如無孩子)

+0

當我這樣使用它。 http://pastebin.com/raw.php?i=bvPfmkbd我得到錯誤說:不能使用未定義的值作爲ARRAY引用。我已經把代碼放在已經檢查定義的IF塊中。編輯爲 – 2014-09-01 10:47:43

+0

以期望沒有CHILDREN – ysth 2014-09-01 14:16:34

3

或許只是使用map代替:

use strict; 
use warnings; 

my @array = (1, 4, 5, 8); 

my %children = (
    1 => [ 2, 3 ], 
    5 => [ 10 ], 
); 

my @new_array = map { ($_, @{ $children{$_} // [] }) } @array; 

print "@new_array\n"; 

輸出:

1 2 3 4 5 10 8 
-1

看不出爲什麼他應該使用map,這可以用數組完成。

有了這個,你可以得到當前元素的索引在循環,看看你在哪裏添加:

my @array = qw(A B C E F G); 
my $search = "C"; 

my %index; 
@index{@array} = (0..$#array); 
my $index = $index{$search}; < - getting the index of the curr element 
print $index, "\n"; 

my @out_array; 
my $insert = 'D'; 

push @out_array, 
     @array[0..$index], 
     $insert, 
     @array[$index+1..$#array]; 

print @array; 
print "\n"; 
print @out_array; 

下面是一個如何可以做到這一點:)工作的例子。

+0

那麼,地圖代碼要簡單得多。 – ysth 2014-09-01 14:19:16

+0

的確如此。但是因爲他要求數組,而唯一的answear是「使用地圖」。:D我認爲這樣會更好,例如它可以做什麼(儘管它更復雜) – Wald 2014-09-01 14:25:20