Это попрошайничество для итераторов (нет! Но это весело). Обратите внимание, что пересмотренное решение также позволяет настроить количество столбцов.
#!/usr/bin/perl
use strict;
use warnings;
use List::AllUtils qw( min );
print_cols('%04d', 1, 100, 11);
sub print_cols {
my ($fmt, $min, $max, $cols) = @_;
my $its = partition($min, $max, $cols);
while ( (my @vals = grep { defined } map {$_->()} @$its)) {
printf join(' ', ($fmt) x @vals) . "\n", @vals;
}
return;
}
sub make_asc_it {
my ($min, $max) = @_;
return sub {
return unless $min <= $max;
return $min ++;
}
}
sub partition {
my ($min, $max, $cols) = @_;
return unless $min <= $max;
my $rows = sprintf '%.0f', ($max - $min) / $cols;
my @its;
for my $col (1 .. $cols) {
push @its, make_asc_it(
min( $min, $max ),
min( $min + $rows - 1, $max )
);
$min += $rows;
}
push @its, make_asc_it($min, $max) if $min <= $max;
return \@its;
}
Вывод для одиннадцати столбцов:
0001 0010 0019 0028 0037 0046 0055 0064 0073 0082 0091 0100
0002 0011 0020 0029 0038 0047 0056 0065 0074 0083 0092
0003 0012 0021 0030 0039 0048 0057 0066 0075 0084 0093
0004 0013 0022 0031 0040 0049 0058 0067 0076 0085 0094
0005 0014 0023 0032 0041 0050 0059 0068 0077 0086 0095
0006 0015 0024 0033 0042 0051 0060 0069 0078 0087 0096
0007 0016 0025 0034 0043 0052 0061 0070 0079 0088 0097
0008 0017 0026 0035 0044 0053 0062 0071 0080 0089 0098
0009 0018 0027 0036 0045 0054 0063 0072 0081 0090 0099