【问题标题】:Merge arrays to make a new array in perl合并数组以在 perl 中创建一个新数组
【发布时间】:2018-08-01 22:00:35
【问题描述】:

在 perl 中将两个数组(按列)合并为一个新的复合数组的方法是什么?

@array1

car
scooter
truck

@array2

four
two
six

我尝试使用以下方法:

my @merged = (@array1, @array2); print @merged;

但它将两个数组合并在一列中,如下所示:

car
scooter
truck
four
two
six

但我想要的是如下:

@merged[0] @merged[1] 
car             four
scooter         two
truck           six

【问题讨论】:

  • 您想要一个 3x2 数组? my @merged = ( \@array1, \@array2 ); 但是你需要使用 2 个索引来获取值。 my $scooter = $merged[0]->[1];
  • 多维数组应该可以

标签: arrays perl


【解决方案1】:

在 Perl 中,如果您将数组存储在列表中,它将自动展平为单个列表

my @array = (@ar1,@ar2);

如果你想存储为一个数组,你应该引用一个数组并将引用存储到另一个数组,比如

my @array = (\@ar1,\@ar2);

现在@array@ar1@ar2 的引用。

然后使用对应的数据类型去引用引用

你的情况

print @{$array[0]}; 

最后,您可以将以下内容用于您的案例

use warnings;
use strict;

my @array1 = qw(car scooter truck);
my @array2 = qw(four five six);

my @merged = (\@array1,\@array2); #referencing the array1 and array2

foreach my $i (0..$#{$merged[0]}) 
{
    # getting the last index value using $#{$merged[0]}

    printf ("%-10s%-10s\n",$merged[0][$i],$merged[1][$i]);


}

【讨论】:

    【解决方案2】:

    从样本数据来看,关联数组(hash)可能是更合适的数据结构:

    my %data;
    @data{@array1} = @array2;
    
    print $data{car}; # "four"
    

    【讨论】:

      【解决方案3】:

      这将按照要求进行:

      my @merged;
      for (my $i=0; $i<=$#array1; ++$i)
      {
          $merged[$i*2] = $array1[$i];
          $merged[$i*2+1] = $array2[$i];
      }
      

      【讨论】:

      • 这似乎将两个数组交错,这与合并它们不同,这与将它们放入二维数组(OP似乎想要)不同。
      【解决方案4】:
      my @merged;
      for (0 .. $#array1) {
          push(@merged, ([$array1[$_],$array2[$_]]));
      }
      

      my @merged;
      push @merged, map {[$array1[$_], $array2[$_]]} 0 .. $#array1;
      

      【讨论】:

      • 这仍然会产生一个像这样的平面数组 - car, four, scooter, two, truck, six,而 OP 似乎需要这样 - $merged[0] = \@array1, $merged[1] = \@array2;
      • Fixed(?) 显然数组的大小也必须相同。
      • 这更接近了,但是矩阵是倒置的。在您的代码中,$merged[0] 将给出 [car,four],而 OP 请求 car,scooter,truck 的代码。
      【解决方案5】:

      但我想要的是如下:

      @merged[0] @merged[1] 
      car             four
      scooter         two
      truck           six
      

      我看到了两种解释方式。

      和 mkHun 一样,作为两个数组引用的列表:

      my @array1 = qw(a b c);
      my @array2 = qw(x y z);
      my @merged = (\@array1, \@array2); # (['a', 'b', 'c'], ['x', 'y', 'z'])
      

      什么时候可以做:

      $merged[0]->[1] # 'b'
      $merged[1]->[2] # 'z'
      

      或作为交错元素的单个列表:

      use List::MoreUtils qw(zip);
      
      my @array1 = qw(a b c);
      my @array2 = qw(x y z);
      my @merged = zip @array1, @array2; # ('a', 'x', 'b', 'y', 'c', 'z')
      

      什么时候可以做:

      $merged[2] # 'b'
      $merged[5] # 'z'
      

      请参阅List::MoreUtils::zip

      【讨论】:

        【解决方案6】:

        试试这个:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-11
          • 2017-11-14
          • 2012-08-14
          • 2021-02-24
          • 2016-09-15
          • 1970-01-01
          • 2021-12-13
          • 1970-01-01
          相关资源
          最近更新 更多