Подтвердить что ты не робот

Как объединить два массива, переменные значения из каждого массива, в perl

предположим, что у меня есть 2 массива, как указано ниже

@a1["Vinay", Raj, harry];
@b1["dude","rock"];

После слияния я хочу получить такой результат

[
    Vinay
    dude
    Vinay
    rock
    Raj
    dude
    Raj
    rock
    harry
    dude
    harry
    rock
]

В основном я хочу объединить значения каждого индекса array1 со всеми значениями индекса array2 2

Добавляя к вышеуказанному вопросу, у меня есть другой запрос

hi для того же вопроса выше, как объединить 2 массива в конкретном индексе массива, например, у меня есть 2 массива из каждых 160 элементов, теперь я хочу объединить массив в каждом пятом элементе в наборах, это возможно..?

Спасибо, Вини

4b9b3361

Ответ 1

Вот один из способов сделать это. Однако не лучший синтаксис perl. Двойной цикл for означает, что вы будете нажимать каждую комбинацию двух массивов в объединенный массив. Я попытался настроить его так, чтобы результат был в том порядке, который вы задали в вопросе.

my @merged;

for my $a ( @a1 ) {
  for my $b ( @b1 ) {
    push( @merged, ($a, $b) );
  }
}

Ответ 2

Просто создайте новый массив:

my @merged = (@a1, @b1);

Вот полный пример:

my @a1 = ("foo", "bar");
my @a2 = ("baz", "spam");

my @merged = (@a1, @a2);

print $merged[3]; #=> "spam"

ИЗМЕНИТЬ: я пропустил требование заказа. Вам просто нужно zip их вместе, что вы можете сделать с помощью List::MoreUtils:

use List::MoreUtils qw(zip);
use Data::Dumper qw(Dumper);

my @a1 = ("Vinay", "Raj", "harry");
my @a2 = ("dude", "rock");

my @merged = zip(@a1, @a2);

print Dumper(\@merged);

Ответ 3

Вот еще один вариант:

use strict;
use warnings;
use Data::Dumper;

my $a = join ',', qw/Vinay Raj harry/;
my $b = join ',', qw/dude rock/;

my @merged = map { split '-' } glob "{$a}-{$b}";

print Dumper \@merged;

Вывод:

$VAR1 = [
          'Vinay',
          'dude',
          'Vinay',
          'rock',
          'Raj',
          'dude',
          'Raj',
          'rock',
          'harry',
          'dude',
          'harry',
          'rock'
        ]

Ответ 4

Прежде всего, не используйте простые слова и, как отмечено в комментарии jmdeldin, всегда ставьте use strict; use warnings; в начале script.

Итак, как сделать эти списки @a1 и @b1? Используйте либо цитаты:

my @a1 = ('Vinay', 'Raj', 'harry');
my @a2 = ('dude', 'rock');

Или используйте qw:

my @a1 = qw(Vinay Raj harry);
my @a2 = qw(dude rock);

Как "объединить" их как указано? Один из способов - использовать пару вложенных циклов. Гораздо более лаконично используйте map a map:

my @merged = map {my $outer = $_; map {($outer, $_)} @b1} @a1;

Вам не нужны специальные возможности из perl 5.12. Просто воспользуйтесь тем, что списки рушится.

Ответ 5

Это можно было сделать ужасно в одной строке:

@merged = grep {not ref} map {[our $t = $_], map {$t,$_} @b1} @a1;

и немного менее жестоко с нажатием внутри

map {our $t = $_, map {push(@merged, $t, $_)} @b1} @a1;

Ответ 6

Используйте Set::CrossProduct из CPAN.

zip из списка:: MoreUtils застегивает элементы в соответствующих (а не кросс-индексах) его списках аргументов.