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