Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225747
  • 博文数量: 36
  • 博客积分: 1188
  • 博客等级: 军士长
  • 技术积分: 802
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 21:45
文章分类

全部博文(36)

文章存档

2020年(1)

2017年(2)

2015年(1)

2014年(1)

2013年(1)

2012年(3)

2011年(27)

分类: WINDOWS

2011-08-26 11:09:00

Text::Table主要用于列宽的计数,有个不完善的地方就是数组中最长一行的字符数得自己估计,主要是懒得写了,而且也不是重点,所以就省了。
一、示例代码1:
  1. #use Acme::PerlTidy;
  2. use Text::Table;
  3. my @a = (
  4.     [ '18m 12s', 't/acceptance.t' ],
  5.     [ '4m 13s', 't/aggregate.t' ],
  6.     [ '4m 14s', 't/aggregate.t', 'host' ],
  7.     [ '4m 15s', 't/aggregate.t', 'host', 'name' ],
  8.     [ '4m 16s', 't/aggregate.ta', 'host', 'name', 'name' ]
  9. );

  10. #my $arr = $arr_re;二维数组的引用
  11. #my $width = '50';自已估计数组中最长一行的字符数
  12. #my $label_p = '+';端点连接符
  13. #my $label_r = '-';行连接符
  14. #my $label_c = '|';列连接符
  15. print "例一:以-做为端点\n";
  16. make_table( \@a, '50', '-', '-', '|' );
  17. print "例二:以+做为端点\n";
  18. make_table( \@a, '50', '+', '-', '|' );

  19. sub make_table {
  20.     my ( $arr, $width, $label_p, $label_r, $label_c ) = @_;
  21.     my @form_L;

  22.     for my $m ( 0 .. @$arr - 1 ) {
  23.         my $tb = Text::Table->new();
  24.         $tb->load( $arr->[$m] );
  25.         my $cols = $tb->n_cols;
  26.         my @form = '';
  27.         my @str = '';
  28.         my $sum;
  29.         for my $n ( 0 .. $cols - 1 ) {
  30.             my $col_with = $tb->colrange($n);
  31.             my $tb_with = $tb->width;
  32.             my $length = int( $width * $col_with / $tb_with + 0.5 );
  33.             $sum += $length;
  34.             if ( $n == $cols - 1 ) {
  35.                 $length = $length + $width - $sum - $n - 2;
  36.             }
  37.             push( @form, "$label_r" x "$length" );
  38.             my $sub = $tb->select($n);
  39.             $sub =~ s/\n//g;
  40.             my $format = '%-' . $length . 's';
  41.             push( @str, sprintf( $format, $sub ) );
  42.         }
  43.         print join( $label_p, @form ), "$label_p\n";
  44.         print join( $label_c, @str ), "$label_c\n";
  45.         @form_L = @form;
  46.     }
  47.     print join( $label_p, @form_L ), "$label_p\n";
  48. }

输出结果如下:

二、示例代码2:

  1. #use Acme::PerlTidy;
  2. use Text::Table;
  3. my $title = [ Time, Test, 'host', 'namee' ];
  4. my $rows = [
  5.     [ '18m 12s', 't/acceptance.t' ],
  6.     [ '4m 13s', 't/aggregate.t' ],
  7.     [ '4m 14s', 't/aggregate.t', 'host' ],
  8.     [ '4m 15s', 't/aggregate.t', 'host', 'name' ],
  9.     [ '4m 16s', 't/aggregate.ta', 'host', 'namee', 'nameeeeeee' ]
  10. ];

  11. print make_table( $title, $rows, );

  12. sub make_table {
  13.     my ( $headers, $rows ) = @_;

  14.     my @rule = qw(- +);
  15.     my @headers = \'|';
  16.     push @headers => map { $_ => \'|' } @$headers;
  17.     my $table = Text::Table->new(@headers);
  18.     $table->load(@$rows);
  19.     return $table->rule(@rule),
  20.       $table->title,
  21.       $table->rule(@rule),
  22.       map( { $table->body($_) } 0 .. @$rows ),
  23.       $table->rule(@rule);
  24. }

输出结果如下:

阅读(2461) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~