Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2396931
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: Python/Ruby

2012-12-11 21:29:20

因为遇到一个输出表格的问题,就研究了一下格式化输出,总结了一下,大概有以下两类:
1. printf
2. format

printf方式

格式为:sprintf FORMAT, LIST
一般格式:
  1.     %% a percent sign
  2.     %c a character with the given number
  3.     %s a string
  4.     %d a signed integer, in decimal
  5.     %u an unsigned integer, in decimal
  6.     %o an unsigned integer, in octal
  7.     %x an unsigned integer, in hexadecimal
  8.     %e a floating-point number, in scientific notation
  9.     %f a floating-point number, in fixed decimal notation
  10.     %g a floating-point number, in %e or %f notation

  11.     %X like %x, but using upper-case letters
  12.     %E like %e, but using an upper-case "E"
  13.     %G like %g, but with an upper-case "E" (if applicable)
  14.     %b an unsigned integer, in binary
  15.     %B like %b, but using an upper-case "B" with the # flag
  16.     %p a pointer (outputs the Perl value
标志位:
  1.     space prefix non-negative number with a space
  2.     + prefix non-negative number with a plus sign
  3.     - left-justify within the field
  4.     0 use zeros, not spaces, to right-justify
  5.     # ensure the leading "0" for any octal,
  6.     prefix non-zero hexadecimal with "0x" or "0X",
  7.     prefix non-zero binary with "0b" or "0B"
例子:
  1.     printf '<% d>', 12; # prints "< 12>"
  2.     printf '<%+d>', 12; # prints "<+12>"
  3.     printf '<%6s>', 12; # prints "< 12>"
  4.     printf '<%-6s>', 12; # prints "<12 >"
  5.     printf '<%06s>', 12; # prints "<000012>"
  6.     printf '<%#o>', 12; # prints "<014>"
  7.     printf '<%#x>', 12; # prints "<0xc>"
  8.     printf '<%#X>', 12; # prints "<0XC>"
  9.     printf '<%#b>', 12; # prints "<0b1100>"
  10.     printf '<%#B>', 12; # prints "<0B1100>"
表格输出实现:
  1. sub table {
  2.     my ($values,$titles) = @_;
  3.     my (@max,$i,$length,$format,@items,$break);
  4.     @max = ();
  5.     for my $value (@$values){
  6.         $i = 0;
  7.         for my $title (@$titles) {
  8.             @max[$i] ||= length($title) + 1;
  9.             $length = 0;
  10.             $length = length($value->{$title}) + 1 if defined $value->{$title};
  11.             @max[$i] = ($length > @max[$i]) ? $length : @max[$i];
  12.             $i++;
  13.         }
  14.     }
  15.     $format = "";
  16.     $break = '';
  17.     for my $i (@max) {
  18.         $format .= "\%-$i".'s';
  19.         $break .= '=' x $i;
  20.     }
  21.     print(sprintf($format,@$titles));
  22.     print($break);
  23.     for my $value (@$values){
  24.         @items = ();
  25.         for my $title (@$titles) {
  26.             my $temp = defined $value->{$title} ? $value->{$title} : '-';
  27.             push(@items,$temp);
  28.         }
  29.         print(sprintf($format,@items));
  30.     }
  31.     return;
  32. }

format方式

format NAME =
FORMLIST
.

第一部分,声明.如上.如果省略 NAME,上面的代码将定义格式输出 STDOUT.
第二部分,格式行FORMLIST 由一些有序的行组成,每一行都是下面三种类型中的一种:
1. 注释,以第一列为 # 来表示.
2. 一个格式行,用来定义一个输出行的格式,就是指上面讲的@,^,<,>,|这样的字符
3. 参数行,数据行,用来向前面的格式行中插入值,都是perl的变量
第三部分, 结束 “.”来表示.

格式行(图形行)语法:
格式行中每个被替换的部分分别以 @ 或者 ^ 开头.这些行不作任何形式的变量代换.
@          字段(不要同数组符号 @ 相混淆)是普通的字段.

<, >,|     字段的长度通过在格式符号 @,^ 后跟随特定长度的 <, >,| 来定义,同时<,>,| 还分别表示,左对齐,右对齐,居中对齐.如果变量超出定义的长度,那么它将被截断.

格式变量
$~ 中 ($FORMAT_NAME)          格式名字
$^ ($FORMAT_TOP_NAME)         当前的表头格式名字存储在
$% ($FORMAT_PAGE_NUMBER)      当前输出的页号
$= ($FORMAT_LINES_PER_PAGE)   每页中的行数
$| ($FORMAT_AUTOFLUSH)      是否自动刷新输出缓冲区存储
$^L ($FORMAT_FORMFEED)       在每一页(除了第一页)表头之前需要输出的字符串存储在

表格输出实现:

  1. sub table1 {
  2.     my ($values,$titles) = @_;
  3.     my (@max,$i,$length,$format,$stdout_top,$stdout,@items,$break);
  4.     @max = ();
  5.     for my $value (@$values){
  6.         $i = 0;
  7.         for my $title (@$titles) {
  8.             @max[$i] ||= length($title) + 2;
  9.             $length = 0;
  10.             $length = length($value->{$title}) + 2 if defined $value->{$title};
  11.             @max[$i] = ($length > @max[$i]) ? $length : @max[$i];
  12.             $i++;
  13.         }
  14.     }

  15.     $format = "";
  16.     $break = '';
  17.     for my $i (@max) {
  18.         $format .= '@' . '<' x $i;
  19.         $break .= '=' x $i;
  20.     }
  21.     $stdout_top = "format STDOUT_TOP =\n$format\n\@\$titles\n$break\n.";
  22.     $stdout = "format STDOUT =\n$format\n\@items\n.";

  23.     eval $stdout_top;
  24.     eval $stdout;

  25.     for my $value (@$values){
  26.         @items = ();
  27.         for my $title (@$titles) {
  28.             my $temp = defined $value->{$title} ? $value->{$title} : '-';
  29.             push(@items,$temp);
  30.         }
  31.         $^ = 'STDOUT_TOP';
  32.         $~ = 'STDOUT';
  33.         $= = 60;
  34.         write;
  35.     }

  36.     return;
  37. }
阅读(3646) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~