数组 – 清理将数组拆分为三分之一并显示给用户的方法

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

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...