【问题标题】:How can I create columnar output in Perl?如何在 Perl 中创建列输出?
【发布时间】:2011-01-29 18:10:53
【问题描述】:

!/usr/bin/env perl

 use warnings;
 use strict;

 my $text = 'hello ' x 30;

 printf "%-20s : %s\n", 'very important text', $text;

这个脚本的输出看起来更像是这样:

very important text      : hello hello hello  hello
hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello
...

但我想要这样的输出:

very important text: hello hello hello hello
                     hello hello hello hello
                     hello hello hello hello
                     ...

我忘了说:文本应该有一个开放端,即文本行的右端应该与终端的大小相对应。

如何更改脚本以实现目标?

【问题讨论】:

  • 你说的是完全合理的段落吗?在终端上这将是既困难又丑陋的。我猜你从来没有在 CPM 上与 WordStar 合作过。

标签: perl printf


【解决方案1】:

你可以使用Text::Wrap:

use strict;
use Text::Wrap;

my $text = "hello " x 30;
my $init = ' ' x 20;
$Text::Wrap::columns = 80;

print wrap ( '', $init,  'very important text : ' . $text );

【讨论】:

  • 文本行的右端应与终端的宽度相对应。使用 Text::Wrap 我有固定宽度的列。
  • @sid_com:您可以使用 Term::Size (search.cpan.org/~timpx/Term-Size-0.2/Size.pm) 来获取终端的列宽,并相应地设置 $Text::Wrap::columns。
  • 与 Dave Sherohman 评论联系后接受了这个答案。
【解决方案2】:

试试这个,

use strict;
use warnings;

 my $text = 'hello ' x 30;

 $text=~s/((\b.+?\b){8})/$1\n                       /gs;
 printf "%-20s : %s\n", 'very important text', $text;

【讨论】:

  • 我忘了说:文本应该有一个开放端,因为文本行的右端应该与终端的大小相对应。
【解决方案3】:
#!/usr/bin/env perl
use warnings; 
use strict;
use 5.010;
use Text::Wrap;
use Term::Size;

my $text = 'hello ' x 30;
my $init = ' ' x 22;
my( $columns, $rows ) = Term::Size::chars *STDOUT{IO};
$Text::Wrap::columns = $columns;

say wrap ( '', $init,  'very important text : ' . $text );

【讨论】:

    【解决方案4】:

    虽然我不能从您的问题中确切地确定您希望输出的格式是什么,但我可以告诉您,在 Perl 语言中输出漂亮的关键是使用格式。

    Perl format primer 是关于如何使用它们来实现几乎任何您想要的输出格式的入门指南。

    【讨论】:

    • 我看过 Perl6::Form 但请参阅我对 karthi-27 的评论
    猜你喜欢
    • 2011-02-23
    • 2013-05-23
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多