Как добавить ссылку на середину существующего массива в Perl? - PullRequest
2 голосов
/ 22 июня 2009

Я хочу иметь возможность поместить массив в массив. Например, у меня может быть такой массив:

my @array1 = ("element 1","element 2","element 3");

Тогда у меня есть другой массив

my $array_ref = ["this will", "go between", "element 1 and 2"];

Я хочу поместить $array_ref в первый, чтобы первый массив выглядит так:

("element 1",["this will", "go between", "element 1 and 2"],"element 2","element 3")

Я не могу этого сделать. Я просмотрел весь Google и ничего не нашел.

Ответы [ 6 ]

7 голосов
/ 22 июня 2009

Таким образом, вы используете splice , чтобы заменить 0 элементов, начиная с элемента 1 (второй элемент, первый элемент 0), на нужные элементы:

splice( @array, 1, 0, ["this will", "go between", "element 1 and 2"] );

Или, возможно, вы имеете в виду:

splice( @array, 1, 0, "this will", "go between", "element 1 and 2" );

если вы не хотите вложенных массивов.

4 голосов
/ 22 июня 2009

Важным моментом, который следует помнить, является различие между () и []. '()' дает вам список элементов, например. (1, 2, 3), который вы можете затем присвоить переменной массива, как это -

my @listOfElem = (1, 2, 3);

'[]' является ссылкой массива и возвращает скалярное значение, которое вы можете включить в свой список.

my $refToElem = ['a', 'b', 'c'];

В вашем случае, если вы инициализируете первый массив, вы можете просто вставить элементы второго массива следующим образом:

my @listOfElem = (1, 2, ['a', 'b', 'c'], 3);
#This gives you a list of "4" elements with the third
#one being an array reference

my @listOfElem = (1, 2, $refToELem, 3);
#Same as above, here we insert a reference scalar variable

my @secondListOfElem = ('a', 'b', 'c');
my @listOfElem       = (1, 2, \@secondListOfElem, 3);
#Same as above, instead of using a scalar, we insert a reference
#to an existing array which, presumably, is what you want to do.

#To access the array within the array you would write -
$listOfElem[2]->[0]  #Returns 'a'
@{listOfElem[2]}[0]  #Same as above.

Если вам нужно добавить элементы массива на лету в середине массива, просто используйте «склейку», как подробно описано в других статьях.

3 голосов
/ 22 июня 2009

Это то, что вы поймете после прочтения первой части Intermediate Perl , которая охватывает ссылки и структуры данных. Вы также можете ознакомиться с кулинарной книгой Perl для структур данных .

Короче говоря, вы сохраняете массив в другом массиве, используя ссылку (которая является просто скаляром):

my @big_array = ( $foo, $bar, \@other_array, $baz );

В вашем случае вы использовали конструктор анонимного массива и просто хотите объединить его в существующий массив. Нет ничего особенного в том, что это ссылка на массив:

splice @big_array, $offset, $length, @new_items;

В вашем случае вы хотели начать с элемента 1, удалить 0 элементов и добавить ссылку:

splice @big_array, 1, 0, $array_ref;
1 голос
/ 22 июня 2009

Использование сращивание .

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @array1 = ("element 1", "element 2", "element 3");
my $array_ref = ["this will", "go between", "element 1 and 2"];
splice(@array1, 1, 0, $array_ref);
print Dumper \@array1;

Будет напечатано следующее:

$VAR1 = [
          'element 1',
          [
            'this will',
            'go between',
            'element 1 and 2'
          ],
          'element 2',
          'element 3'
        ];
1 голос
/ 22 июня 2009

У вас есть массив и ссылка на массив.

#!/usr/bin/perl

use strict;
use warnings;

my @array    = ("element 1","element 2","element 3");
my $arrayref = ["this will", "go between", "element 1 and 2"];

splice( @array, 1, 0, $arrayref );  # Grow the array with the list (which is $arrayref)

for ( my $i = 0; $i <= $#array; $i++ ) {
    print "\@array[$i] = $array[$i]\n";
}
1 голос
/ 22 июня 2009

Попробуйте использовать временный массив, например:

@temp_arr = ("this will", "go between", "element 1 and 3");
@my_arr = ("element 1", \@temp_arr, "element 3");

Вы можете использовать подэлементы следующим образом:

print $my_arr[1]->[0]; # prints 'this will'

Обратитесь к подобласти так:

print @$my_arr[1]; # Right! Prints 'this willgo betweenelement 1 and 2'

# Don't do this:
print $my_arr[1]; # Wrong! Prints something like: 'ARRAY(0xDEADBEEF)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...