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

qw(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll)


有没有一种简单的方法可以在三列中显示它,以便


前三分之一在左列
中间三分之一在中间列
最后三分之一在右列


这样一来,元素可以在屏幕下方而不是屏幕上方显示。例如

aaa eee iii
bbb fff jjj
ccc ggg kkk
ddd hhh lll


我一直在尝试使用模数,但是它变得越来越复杂,并认为可能会有一个优雅的解决方案。最终,我打算将其用于bash中的select

谢谢。

最佳答案

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


要么

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


要么

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




不假定@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;


要么

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;


要么

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");
}

07-28 03:33