在Perl中使用列创建二维数组的数组



我在Perl中有三个数组:

my @col1 = ('A', 'B', 'C', 'D');
my @col2 = ('2', '4', '6', '8');
my @col3 = ('Abc', 'Ghy', 'Tgh', 'Yth');

如何将这三个数组组合在一起,使结果看起来像

col1 | col2 | col3


A 2 Abc

b4 gy

C 6 Tgh

D 8 Yth

更新

我希望它是清楚的如何生成一个二维数组给定相同的函数。这里只是以防万一

use strict;
use warnings;
use List::MoreUtils qw/ each_array /;
my @col1 = qw/ A   B   C   D   /;
my @col2 = qw/ 2   4   6   8   /;
my @col3 = qw/ Abc Ghy Tgh Yth /;
my $iter = each_array @col1, @col2, @col3;
my @result;
while ( my @row = $iter->() ) {
    push @result, @row;
}
use Data::Dump;
dd @result;

输出
[
  ["A", 2, "Abc"],
  ["B", 4, "Ghy"],
  ["C", 6, "Tgh"],
  ["D", 8, "Yth"],
]

或者如果你不想使用非核心模块,那么这将按照你的要求做

use strict;
use warnings;
use List::Util qw/ max /;
my @col1 = qw/ A   B   C   D   /;
my @col2 = qw/ 2   4   6   8   /;
my @col3 = qw/ Abc Ghy Tgh Yth /;
my @cols = (@col1, @col2, @col3);
my @result;
for my $i ( 0 .. max map $#$_, @cols ) {
    push @result, [ map $_->[$i], @cols ];
}

结果@result是相同的


原始文章

我建议你使用List::MoreUtils中的each_array函数。给定数组列表,它返回一个迭代器函数,每次调用

时,该函数将从这些数组中返回下一组值。

下面是一些使用你自己的数据的示例代码

use strict;
use warnings;
use List::MoreUtils qw/ each_array /;
my @col1 = qw/ A   B   C   D   /;
my @col2 = qw/ 2   4   6   8   /;
my @col3 = qw/ Abc Ghy Tgh Yth /;
my $iter = each_array @col1, @col2, @col3;
while ( my @row = $iter->() ) {
    print "@rown";
}

输出
A 2 Abc
B 4 Ghy
C 6 Tgh
D 8 Yth

一种就是把它们粘在一起:

my @combined = ( @col1, @col2, @col3); 

因为你的输出只是一个显示它的问题。

然而另外

:

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @col1 = ( 'A',   'B',   'C',   'D' );
my @col2 = ( '2',   '4',   '6',   '8' );
my @col3 = ( 'Abc', 'Ghy', 'Tgh', 'Yth' );
my @combined;
while ( @col1 or @col2 or  @col3 ) {
    push( @combined, [ map { shift ( @$_ ) // '' } (@col1, @col2, @col3 ) ] );
}

print Dumper @combined;

将旋转你的数组,这样你可以:

print join ( "|", @$_ ),"n" for @combined;

最新更新