我该如何在Perl中创建列输出?

5

!/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。 - Sinan Ünür
4个回答

5

您可以使用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
1
@sid_com:你可以使用Term::Size(http://search.cpan.org/~timpx/Term-Size-0.2/Size.pm)获取终端窗口的列宽,并相应地设置$Text::Wrap::columns。 - Dave Sherohman
与Dave Sherohman评论的联络中,接受了此答案。 - sid_com

3

请尝试以下内容,

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;

我忘了提到:文本应该具有开放式末端,即文本行的右侧应对齐终端的大小。 - sid_com

0
#!/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 );

0

虽然我不确定您想要的输出格式是什么,但我可以告诉您,在Perl语言中实现漂亮的输出的关键是使用格式。

有关如何使用它们来实现几乎任何输出格式的入门指南,请参阅Perl format primer


我已经浏览了Perl6::Form,但请看我的评论给karthi-27。 - sid_com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接