如何创建数字标尺和均匀间隔的数字宽度标记

How to create a numeric ruler and evenly spaced numeric width markers

我是 Perl 新手。一个练习,我要创建一个数字标尺,从中我将数据列的大小设置为 20 个字符宽度,这个练习被证明有点难以完成。到目前为止,我有,

printf “%10d” x 5, (1..6);

@ruler = (1..10) x 7;
Print @ruler, “\n”;

它应该看起来像,

1         2         3         4
1234567890123456789012345678901234567890

我得到的第一行数字是一个错误,‘ 行 # 处的 printf 中的冗余参数;底行产生从 1 到 10 的数字,就像范围运算符应该的那样,但我希望它产生 1 到 9,最后是零。我确实想过从0开始范围,但我还没有想出如何删除第一个索引并且只删除第一个索引。

非常感谢您对这两个问题的指导。

警告是因为您将 6 个数字传递给 printf,但格式只需要 5 个。


对我来说,

1         2         3         4
1234567890123456789012345678901234567890

读作

11, 12, 13, ..., 19, 10, 21, 22, 23, ...

为什么以11开头?为什么 10 在 19 和 21 之间?

以下更有意义:

          1         2         3         4
01234567890123456789012345678901234567890      0-based

         1         2         3         4
1234567890123456789012345678901234567890       1-based

我不会直接给出解决方案。

  • 如果你想要数字 1 到 9 和 0,那就是 1..9, 0
  • %10d 将在左侧添加填充。 %-10d 将在右侧添加填充。
  • 没有人说你不能用不重复的东西作为输出的前缀,比如零或 space。

提供所需的输出11而不是1开始计数——它看起来不正确.

也许 OP 打算从 1 开始计数,直到某个 $max 值,并在主计数器上方放置一个代表 tens 的数字。

请研究以下代码示例以符合您的要求。

use strict;
use warnings;
use feature 'say';

my $max = shift || 45;

rule($max);

sub rule {
    my $max = shift;
    
    my($a,$b);
    $a .= ' ' x 9 . $_ for 1..$max/10;
    $b .= $_ % 10      for 1..$max;
    
    say $a . "\n" . $b;
}

输出

         1         2         3         4
123456789012345678901234567890123456789012345

原始 OP 的代码需要稍作修改才能获得所需的输出

use strict;
use warnings;
use feature 'say';

my $max = shift || 45;

printf "%10d" x int($max/10) . "\n", (1..$max/10);
print  $_ % 10 for 1..$max;
print "\n";