Как объединить два массива, переменные значения из каждого массива, в 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 элементов, теперь я хочу объединить массив в каждом пятом элементе в наборах, это возможно..?
Спасибо,
Вини
Ответы
Ответ 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 застегивает элементы в соответствующих (а не кросс-индексах) его списках аргументов.