清理将阵列拆分为三分之一并显示给用户的方法

Dav*_*vid 8 arrays perl

我在perl脚本中有一个排序数组,例如:

qw(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll)
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以将它显示在三列中

  1. 第三个是左列
  2. 中间三分之一在中间栏
  3. 最后三分之一在右栏

这样就可以在屏幕上显示元素而不是在屏幕上显示元素.例如

aaa eee iii
bbb fff jjj
ccc ggg kkk
ddd hhh lll
Run Code Online (Sandbox Code Playgroud)

我一直试图使用模数,但它变得越来越复杂,并认为可能有一个优雅的解决方案.最终我打算将它用于类似于selectbash的东西.

谢谢.

ike*_*ami 8

use List::MoreUtils qw( part );
my $num_rows = int(@a/3);
my @aoa = map [ @a[@$_] ], part { $_ % $num_rows } 0..$#a;
print("@$_\n") for @aoa;
Run Code Online (Sandbox Code Playgroud)

要么

use List::MoreUtils qw( part );
my $num_rows = int(@a/3);
my @aoa = part { $_ % $num_rows } 0..$#a;
print("@a[ @$_ ]\n") for @aoa;
Run Code Online (Sandbox Code Playgroud)

要么

my $num_rows = int(@a/3);
for my $row_num (0..$num_rows-1) {
   print("@a[ map { $row_num + $num_rows*$_ } 0..2 ]\n");
}
Run Code Online (Sandbox Code Playgroud)

以上版本不假设@a%3 == 0.

use List::MoreUtils qw( part );
use POSIX           qw( ceil );
my $num_rows = ceil(@a/3);
my @aoa = map [ @a[@$_] ], part { $_ % $num_rows } 0..$#a;
print("@$_\n") for @aoa;
Run Code Online (Sandbox Code Playgroud)

要么

use List::MoreUtils qw( part );
use POSIX           qw( ceil );
my $num_rows = ceil(@a/3);
my @aoa = part { $_ % $num_rows } 0..$#a;
print("@a[ @$_ ]\n") for @aoa;
Run Code Online (Sandbox Code Playgroud)

要么

use POSIX qw( ceil );
my $num_rows = ceil(@a/3);
for my $row_num (0..$num_rows-1) {
   print("@a[ grep { $_ < @a } map { $row_num + $num_rows*$_ } 0..2 ]\n");
}
Run Code Online (Sandbox Code Playgroud)