操作数组:将新元素插入某个索引并移动其他元素

时间:2014-09-01 07:48:55

标签: arrays perl splice

我有一个数组说

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
        }
}

3 个答案:

答案 0 :(得分: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 :(得分: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;

(假设......-> {CHILDREN}将不存在,或者无论如何都是假的,如果没有孩子的话)

答案 2 :(得分:-1)

不知道为什么他应该使用地图这可以用数组完美地完成。

通过这个,您可以获得循环中当前元素的索引,以查看您要添加的位置:

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;

以下是如何做到这一点的工作示例:)。