Как извлечь подмассивы из массива с помощью Perl - PullRequest
0 голосов
/ 20 сентября 2018

Предположим, у меня есть этот массив.(Perl)

@arr= ((a,b,c),(a,2,3,4,5,j),(l),(t,x,51));

Как извлечь подмассивы?Кроме того, как определить индекс каждого подмассива? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Скобки просто влияют на приоритет.Perl сведет массив массивов в один массив.Чтобы смоделировать массив или массивы, вам необходимо создать массив ссылок на массивы ([], [], []), как показано ниже.

use strict;
use warnings;
my @arr= (['a','b','c'],['a',2,3,4,5,'j'],['l'],['t','x',51]);

print $arr[0]->[1]; #prints b
print $arr[1]->[2]; #prints 3

#prints all elements
foreach my $arrRef(@arr) {
    foreach my $element(@$arrRef) {
        print "$element\n";
    }
}
0 голосов
/ 20 сентября 2018

Прежде всего, как сказал Flying_whale в своем комментарии , в Perl списки всегда сглаживаются.Многомерные списки не существуют.Это означает, что

( 1, 2, 3, (4, 5) )

- это то же самое, что и

( 1, 2, 3, 4, 5 )

или

( 1, (2, (3, (4, (5, () ) ) ) ) )

Все они сглаживаются.

КакЯ извлекаю подмассивы , используя их размер или определяю индекс конца каждого элемента?

Вы говорите, что знаете размер каждого элемента.В этом случае у вас есть несколько опций.

# index               0 1 2      3 4 5 6 7 8      9      10 11 12
my @long_array = ( qw(a b c), qw(a 2 3 4 5 j), qw(l), qw(t  x  51));

my @abc    = @long_array[0 .. 2];
my @a2345j = @long_array[3 .. 8];
my $l      = $long_array[9];
my @tx51   = @long_array[10, 11, 12];

В основном это фрагментов массива , поэтому сигил из @long_array[0 .. 2] равен @, а не $, поскольку выражение возвращает список , а не скаляр .

Альтернативой является использование splice, но это изменило бы ваш начальный массив.

В любом случае вы должны знать начало и длину каждого отдельного подсписка.Поскольку нет подсписков, это единственный способ получить каждый фрагмент данных.Если вы не знаете ни начального индекса, ни длины, вам не повезло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...