因为遇到一个输出表格的问题,就研究了一下格式化输出,总结了一下,大概有以下两类:
1. printf
2. format
printf方式格式为:
sprintf FORMAT, LIST一般格式:
- %% a percent sign
- %c a character with the given number
- %s a string
- %d a signed integer, in decimal
- %u an unsigned integer, in decimal
- %o an unsigned integer, in octal
- %x an unsigned integer, in hexadecimal
- %e a floating-point number, in scientific notation
- %f a floating-point number, in fixed decimal notation
- %g a floating-point number, in %e or %f notation
- %X like %x, but using upper-case letters
- %E like %e, but using an upper-case "E"
- %G like %g, but with an upper-case "E" (if applicable)
- %b an unsigned integer, in binary
- %B like %b, but using an upper-case "B" with the # flag
- %p a pointer (outputs the Perl value
标志位:
- space prefix non-negative number with a space
- + prefix non-negative number with a plus sign
- - left-justify within the field
- 0 use zeros, not spaces, to right-justify
- # ensure the leading "0" for any octal,
- prefix non-zero hexadecimal with "0x" or "0X",
- prefix non-zero binary with "0b" or "0B"
例子:
- printf '<% d>', 12; # prints "< 12>"
- printf '<%+d>', 12; # prints "<+12>"
- printf '<%6s>', 12; # prints "< 12>"
- printf '<%-6s>', 12; # prints "<12 >"
- printf '<%06s>', 12; # prints "<000012>"
- printf '<%#o>', 12; # prints "<014>"
- printf '<%#x>', 12; # prints "<0xc>"
- printf '<%#X>', 12; # prints "<0XC>"
- printf '<%#b>', 12; # prints "<0b1100>"
- printf '<%#B>', 12; # prints "<0B1100>"
表格输出实现:
- sub table {
- my ($values,$titles) = @_;
- my (@max,$i,$length,$format,@items,$break);
- @max = ();
- for my $value (@$values){
- $i = 0;
- for my $title (@$titles) {
- @max[$i] ||= length($title) + 1;
- $length = 0;
- $length = length($value->{$title}) + 1 if defined $value->{$title};
- @max[$i] = ($length > @max[$i]) ? $length : @max[$i];
- $i++;
- }
- }
- $format = "";
- $break = '';
- for my $i (@max) {
- $format .= "\%-$i".'s';
- $break .= '=' x $i;
- }
- print(sprintf($format,@$titles));
- print($break);
- for my $value (@$values){
- @items = ();
- for my $title (@$titles) {
- my $temp = defined $value->{$title} ? $value->{$title} : '-';
- push(@items,$temp);
- }
- print(sprintf($format,@items));
- }
- return;
- }
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) 在每一页(除了第一页)表头之前需要输出的字符串存储在
表格输出实现:
- sub table1 {
- my ($values,$titles) = @_;
- my (@max,$i,$length,$format,$stdout_top,$stdout,@items,$break);
- @max = ();
- for my $value (@$values){
- $i = 0;
- for my $title (@$titles) {
- @max[$i] ||= length($title) + 2;
- $length = 0;
- $length = length($value->{$title}) + 2 if defined $value->{$title};
- @max[$i] = ($length > @max[$i]) ? $length : @max[$i];
- $i++;
- }
- }
- $format = "";
- $break = '';
- for my $i (@max) {
- $format .= '@' . '<' x $i;
- $break .= '=' x $i;
- }
- $stdout_top = "format STDOUT_TOP =\n$format\n\@\$titles\n$break\n.";
- $stdout = "format STDOUT =\n$format\n\@items\n.";
- eval $stdout_top;
- eval $stdout;
- for my $value (@$values){
- @items = ();
- for my $title (@$titles) {
- my $temp = defined $value->{$title} ? $value->{$title} : '-';
- push(@items,$temp);
- }
- $^ = 'STDOUT_TOP';
- $~ = 'STDOUT';
- $= = 60;
- write;
- }
- return;
- }
阅读(3690) | 评论(0) | 转发(1) |