【问题标题】:How to get every first element from the multidimensional array in Perl?如何从 Perl 中的多维数组中获取每个第一个元素?
【发布时间】:2014-11-01 12:51:57
【问题描述】:

我有一个多维(2D)@array

我编写了以下代码从每个嵌套数组中获取第一个元素:

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

my @array = (
    [ '/dev/vg00/lvol6', 114224,  46304,   67920,   '41%', '/home' ],
    [ '/dev/vg00/lvol7', 8340704, 4336752, 4003952, '52%', '/opt' ],
    [ '/dev/vg00/lvol4', 520952,  35080,   485872,  '7%',  '/tmp' ],
);

my @new_array;

foreach (@array) {
    push @new_array, @$_[0];
}

是否有更好或更快的方法(例如,使用 map 函数)来生成具有以下值的新数组(嵌套数组中的每个第一个元素/值):

$VAR1 = [
          '/dev/vg00/lvol6',
          '/dev/vg00/lvol7',
          '/dev/vg00/lvol4'
        ];

附言。对于一个琐碎的问题,我很抱歉,但是今天(星期一早上)我今天脑子里一片空白。

【问题讨论】:

    标签: arrays perl multidimensional-array


    【解决方案1】:

    使用map, and click here for the perldoc

    use strict; 
    use warnings;
    use Data::Dumper;
    
    my @array = (
                 ['/dev/vg00/lvol6', 114224, 46304, 67920, '41%', '/home'],
                 ['/dev/vg00/lvol7', 8340704, 4336752, 4003952, '52%', '/opt'],
                 ['/dev/vg00/lvol4', 520952, 35080, 485872, '7%', '/tmp']
                );
    
    my @new_array = map { $_->[0] } @array; 
    
    print Dumper(\@new_array);
    

    打印出来:

    $VAR1 = [
          '/dev/vg00/lvol6',
          '/dev/vg00/lvol7',
          '/dev/vg00/lvol4'
        ];
    

    【讨论】:

    • 优秀。 正确的方式。
    • 什么是不合适的,foreach 循环?
    【解决方案2】:
    my @new_array = map $_->[0], @array;
    

    虽然map 可能不是更快的选择,

    my @array = (
          ['/dev/vg00/lvol6', 114224, 46304, 67920, '41%', '/home'],
          ['/dev/vg00/lvol7', 8340704, 4336752, 4003952, '52%', '/opt'],
          ['/dev/vg00/lvol4', 520952, 35080, 485872, '7%', '/tmp']
    );
    sub umap {
      my @new_array = map $_->[0], @array;
      return;
    }
    sub ufor {
      my @new_array;
      foreach (@array) {
          push @new_array, $_->[0];
      }
      return;
    }
    
    use Benchmark qw( cmpthese ) ;
    cmpthese( -5, {
        umap => \&umap,
        ufor => \&ufor,
    });
    

    结果

             Rate umap ufor
    umap 691765/s   -- -14%
    ufor 804475/s  16%   --
    

    【讨论】:

    • 过早的优化(和一个糟糕的启动基准)
    • ummap 返回@new_array; ufor 没有。
    • (虽然修复并不会改变结果)
    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2019-11-25
    • 2021-10-04
    相关资源
    最近更新 更多