【问题标题】:Looking for an elegant way of conversion of multidimensional arrays into one dimensional arrays in Perl在 Perl 中寻找一种将多维数组转换为一维数组的优雅方法
【发布时间】:2015-05-14 05:33:30
【问题描述】:

我正在将一维数组转换为多维数组。请参阅下面的代码了解我在做什么。我还在学习 perl,所以想改进我的代码。

我的问题:我可以在一行中进行转换吗?

我认为 Perl 能够做到这一点。编写子程序时可以赋值:

    my ($one, $two, $three) = @_;

我的代码:

    #!/usr/bin/perl -w

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

    my @oneDim = (
      'COL', 'EUR', 'Fruit', 'apple',
      'HZP', 'USD', 'Fruit', 'banana',
      'HKG', 'USD', 'Food', 'burger',
      'IML', 'USD', 'IT', 'keyboard');

    #  (@fourDim[0],@fourDim[1],@fourDim[2],@fourDim[3]) = @oneDim;
    sub main() {
      my @fourDim = ([],[],[],[]);
      for (my $i = 0; 4 * $i + 3 < scalar(@oneDim); ++$i)
      {
        push @{$fourDim[0]}, $oneDim[$i * 4 + 0];
        push @{$fourDim[1]}, $oneDim[$i * 4 + 1];
        push @{$fourDim[2]}, $oneDim[$i * 4 + 2];
        push @{$fourDim[3]}, $oneDim[$i * 4 + 3];
      }

      print Dumper @fourDim;
    }

    main();

结果如下:

    $VAR1 = [
      'COL',
      'HZP',
      'HKG',
      'IML'
    ];
    $VAR2 = [
      'EUR',
      'USD',
      'USD',
      'USD'
    ];
    $VAR3 = [
      'Fruit',
      'Fruit',
      'Food',
      'IT'
    ];
    $VAR4 = [
      'apple',
      'banana',
      'burger',
      'keyboard'
    ];

我在这里找到了反向转换: https://stackoverflow.com/a/8611430/2764334

但我找不到将一维数组转换为多维数组的优雅方法。就我而言,我知道总是有相同的订单(代码、货币、类型、产品)

【问题讨论】:

    标签: arrays perl multidimensional-array


    【解决方案1】:

    拼接可能会有所帮助:

    my @oneDim = ( 
        'COL', 'EUR', 'Fruit', 'apple',
        'HZP', 'USD', 'Fruit', 'banana',
        'HKG', 'USD', 'Food', 'burger',
        'IML', 'USD', 'IT', 'keyboard');
    
    my @fourDim;
    my $k = @oneDim / 4;
    push @fourDim, [ splice @oneDim, 0, $k ] while @oneDim;
    print join(", ", @$_), "\n" for @fourDim;
    

    这给出了:

    COL, EUR, Fruit, apple
    HZP, USD, Fruit, banana
    HKG, USD, Food, burger
    IML, USD, IT, keyboard
    

    【讨论】:

      【解决方案2】:

      几乎只有一行,但很容易理解:

      use List::MoreUtils 'part';
      my $i = 0;
      my @fourDim = part { $i++ / 4 } @oneDim;
      

      像往常一样,reduce 可以一行完成,但更难理解:

      use List::Util 'reduce';
      my $fourDim = reduce { push @{ $a->[ @$a && @{$a->[-1]} < 4 ? -1 : @$a ] }, $b; $a } [], @oneDim;
      

      虽然这些方法在未知大小的列表上同样有效;给定一个数组@oneDim,你可以这样做:

      my @fourDim = map [ @oneDim[$_*4..$_*4+3] ], 0..@oneDim/4-1;
      

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 2019-06-29
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2020-11-19
        相关资源
        最近更新 更多