16

以下のような2つの配列があるとします

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

マージ後、このような結果が必要です

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

基本的に、array1 の各インデックス値を array2 のすべてのインデックス値にマージしたいと考えています。

上記の質問に加えて、別の質問があります。

上記の同じ質問に対して、特定の配列インデックスで 2 つの配列をマージする方法。たとえば、各 160 要素の 2 つの配列があり、セット内の 5 番目の要素ごとに配列をマージしたいのですが、それは可能ですか?

4

6 に答える 6

53

新しい配列を作成するだけです:

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);
于 2012-10-28T06:33:01.663 に答える
10

ここにそれを行う1つの方法があります。ただし、最適な perl 構文ではない可能性があります。double for ループは、2 つの配列のすべての組み合わせをマージされた配列にプッシュすることを意味します。結果が質問で指定した順序になるように設定しようとしました。

my @merged;

for my $a ( @a1 ) {
  for my $b ( @b1 ) {
    push( @merged, ($a, $b) );
  }
}
于 2012-10-28T06:34:38.000 に答える
4

まず、ベアワードを使用しないでください。jmdeldin のコメントに記載されているように、常にuse strict; use warnings;スクリプトの先頭に配置してください。

では、これらのリストを作成する方法@a1@b1? 引用符を使用します。

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

または使用qw

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

これらを指定どおりに「マージ」する方法は? 1 つの方法は、ネストされたループのペアを使用することです。より簡潔に言うと、 amapの a を使用しmapます。

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

perl 5.12 からの特別な機能は必要ありません。リストが崩壊するという事実を利用してください。

于 2012-10-28T13:10:06.873 に答える
4

別のオプションは次のとおりです。

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'
        ]
于 2012-10-28T06:53:35.730 に答える
1

それは一行でひどく行うことができます:

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

内側に押し込むと、少し凶悪ではなくなります

map {our $t = $_, map {push(@merged, $t, $_)} @b1} @a1;
于 2012-10-28T09:08:00.323 に答える
0

Set::CrossProductCPAN から使用します。

zipfrom List::MoreUtilsは、引数リストの対応する ( cross ではない) インデックスで要素圧縮します。

于 2012-10-28T10:32:29.897 に答える