2010-03-20 67 views
5

在/ usr/bin中/ env的perl的

use warnings; 
use strict; 

my $text = 'hello ' x 30; 

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

这个脚本的输出看起来更矿石较少像这样:如何在Perl中创建列输出?

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 
        ... 

我忘了提及:文本应该有一个开放的结尾,因为文本行的右端应该对齐终端的大小。

我怎样才能改变我的脚本来达到我的目标?

+2

请解释清楚 – muruga 2010-03-20 08:24:26

+0

你说的是完全有道理的段落?这在终端上既困难又丑陋。我想你从未在CPM上使用过WordStar。 – 2010-03-20 13:05:22

回答

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); 
+0

文本行的右端应对齐终端的宽度。使用Text :: Wrap我有固定宽度的列。 – 2010-03-20 10:19:51

+1

@sid_com:您可以使用Term :: Size(http://search.cpan.org/~timpx/Term-Size-0.2/Size.pm)获取终端的列宽,并设置$ Text :: Wrap: :相应的列。 – 2010-03-20 12:26:08

+0

与Dave Sherohman的评论联系接受了此答案。 – 2010-03-20 14:12:26

0

虽然我不确定你的问题究竟是什么格式,你希望你的输出,我可以告诉你,Perl语言输出的关键是使用格式。

有关如何使用它们来实现几乎任何输出格式的入门知识是Perl format primer

+0

我已经浏览了一下Perl6 :: Form,但请参阅我对karthi-27的评论 – 2010-03-20 09:26:54

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; 
+0

我忘了提及:文本应该有一个开放的结尾,因为文本行的右端应该对齐终端的大小。 – 2010-03-20 09:23:58

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);