sub fooquux { $aref = shift; for ( my $i = 0; $i < @$aref; $i ++ ) { my $item = $aref-> [ $i ]; fooquux( $item-> { value }) if $item-> { type } eq 'items'; next unless $item-> { type } eq 'foo'; my @list = SPLIT_FOO( $item ); splice @$aref, $i, 1, @list; $i += $#list } }