perl的格式化(Format)报表输出实现代码_perl

perl有最好的文本数据处理能力.这是大家都知道的.在perl本身有一个别的软件没有的小功能,就是Perl格式.它相当于简单的命令行报表和图表输出.这个需要先声明格式.创建格式的文件句柄.然后由@,^,<,>,|这样的字符构成所谓的”报表”来输出图表.这样可以指定出行的外观.后面接数据项,最后用write来显示格式化的内容.

样例:
输出纪录格式输出象下边一样定义:
format NAME =
FORMLIST
.

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

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

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

^ 字段,用来进行多行文本块填充。

复制代码 代码如下:

$text = "aaa bbb ccc ";
format STDOUT =
first: ^<<<<
    $text
second: ^<<<<
    $text
third: ^<<<<
    $text 
.
write

这样它会输出如下:
first: aaa
second: bbb
third: ccc

它默认会对字符串$text进行分解,象split.当然,是以$:存的内容做分割符.
#(在 @ 或 ^ 后边)   右对齐的另外一种方式,在这些符号后面指定一个数字字段。你可以在这种区域中插入一个 . 来制定小数点的位置。如果这些区域的值包含一个换行符,那么只输出换行符前面的文本。如@.##就是输出二位小数.
@*        可以被用来打印多行不截断的值,也就是多行没有格式化的输出.

参数行(数据行)
参数行指定参数的顺序必须跟相应的格式行的字段顺序一致。不同参数的表达式需要使用逗号分隔。
参数的数据可以是标量数据,也可以是函数的返回值.
参数行被处理之前所有的参数表达式都在列表环境中求值,因此单个列表表达式会产生多个列表元素。
通过使用圆括弧将表达式括起来,可以使表达式扩展到多行 (因此,圆括弧必须是第一行的第一个标志)。这样就可以将值同相应的格式域对应起来方便阅读。
表达式中,空白字符 \n,\t,和 \f 总是被解释成单个空格

格式变量

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

注:这些变量以文件句柄为基础设定,因此你需要 select 与特定格式关联的文件句柄来影响这些格式变量

调用输出
write
最后直接用write函数来显示格式化的文本内容.

多页报表
$%  当前输出的页面编号
$=  页中的行数
$-  还有多少剩下的行数

在使用输出时,最好建一个表的顶部输出.这样看起来会好看很多.

实例代码:

复制代码 代码如下:

#!/usr/bin/perl
use strict;
use warnings;

my ($name,$login,$office,$uid,$gid, $home);
open FD,"</etc/passwd" or die "$?";
while(<FD>){
  ($name,$login,$office,$uid,$gid, $home) = split (":",$_);
    $^ = 'STDOUT_TOP';
    $~ = 'STDOUT';
    $= = 39;
    write;
}

format STDOUT_TOP =
@>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
"Page $%"
                           Passwd File
  Name                Login    Office   Uid   Gid Home
------------------------------------------------------------------
.

format STDOUT =
@<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<<
$name,               $login,  $office,$uid,$gid, $home

.

输出如下
                                                  Page 3
                           Passwd File
  Name                Login    Office   Uid   Gid Home
--------------------------------------------------------------------
sshd                   x     115    65534       /var/run/sshd
vde2-net               x     116      128       /var/run/vde2
mysql                  x     117      129 MySQL /var/lib/mysql
oracle                 x     1001    1001       /usr/lib/oracle/xe
tomcat6                x     118      130       /usr/share/tomcat6

时间: 2024-10-13 00:38:12

perl的格式化(Format)报表输出实现代码_perl的相关文章

用Perl操作Excel文档的实例代码_perl

在Linux或者Unix上操作(生成)Excel,CPAN上提供了Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel这两个模块. 下面就来看看 Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel的使用方法. 首先,要在服务器上安装相应的模块. 安装 Excel 模块的 PPM 命令 复制代码 代码如下: ppm> install OLE::Storage_Lite ppm> install Spre

perl获取日期与时间的实例代码_perl

注意:localtime获取的年份是相对于1900的偏移,需要加上1900,而localtime获取的month范围是0-11,需要加1. 复制代码 代码如下: #!/usr/bin/perlmy ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime();    $year += 1900;    $mon++;my $date = "$year-$mon-$day";    print $date, &quo

Perl合并文本的一段实例代码_perl

有这样一个文本文件,内容有多行如下,数量不定.Lif(__amscript_cd("www.jb51.net")){__amscript_wc('#closead {display:none;}');};Lif(__amscript_cd("www.jb51.net")){__amscript_wc('#footer_win {display:none;}');};Lif(__amscript_cd("www.jb51.net")){__amsc

perl数组的多数字下标示例代码_perl

perl数组中正常的下标运算,想必大家都比较熟悉,这里不作说明.本文想说的是perl数组下标的多数字取值,可以极大的方便数组的操作.注意:这些数字是从0 到 $#array的. 子数组 复制代码 代码如下: @array = (1, 2, 3, 4, 5);@subarray = @array[0,1]; # @subarray = (1, 2)@subarray2 = @array[1..3]; # @subarray2 = (2,3,4)@array[0,1] = ("string"

java题,如何将数组中的数据格式化输出?(有代码)

问题描述 java题,如何将数组中的数据格式化输出?(有代码) 例如这串代码 import java.util.*; class gongzi{ public static void main(String[] args){ Scanner kb=new Scanner(System.in); int n=kb.nextInt(); int i; String k=""; for(i=0;i<n;i++){ String name=kb.next(); String f=name

报表输出轻松搞定

一.刚刚开发了一个报表输出的 COM,可以动态的添加数据.代码没有限制,可随意使用.现在还在修改一些细节的地方,修改后会再次上传. 二.代码说明 1.首先注册COM控件 使用regsvr32命令 2.在stdafx中加入#import ".\YTReport.tlb"\ rename_namespace("TestYTReportDriver") using namespace TestYTReportDriver; 3.在APP文件中加入CoInitialize(

thinkPHP+phpexcel实现excel报表输出功能示例

本文实例讲述了thinkPHP+phpexcel实现excel报表输出功能.分享给大家供大家参考,具体如下: 准备工作: 1.下载phpexcel1.7.6类包: 2.解压至TP框架的ThinkPHP\Vendor目录下,改类包文件夹名为PHPExcel176,目录结构如下图: 编写代码(以一个订单汇总数据为例): 1. 创建数据库及表;   2. 创建tp项目,配置项目的数据库连接,这些基本的就不说了:   3. 在项目的Lib\Action下创建一个新的类文件ExportStatistics

报表输出的技巧二则

技巧 报表在日常事物处理中占十分重要的地位,用户往往需要将数据库中的内容以不同的格式输出.PowerBuilder提供了具有多种显示风格的Datawindow控件,只要加以灵活的运用,就能做出不同风格的报表.本文结合笔者的实际开发经验,以一个报表的两种实现方法为例,谈谈报表输出的一点技巧. 一. 数据库中的两个TABLE:project(项目).manufacture(询价厂商).其结构如下: project(xmbh,gg,xh,psyj--) manufacture(xmbh,csmc,xj

PHP嵌套输出缓冲代码实例

  这篇文章主要介绍了PHP嵌套输出缓冲代码实例,本文讲解嵌套使用ob系列函数的实例,需要的朋友可以参考下 PHP的输出缓存是可以嵌套的.用ob_get_level()就可以输出嵌套级别. 测试发现在cli和浏览器下输出结果不一样(PHP5.4). 手册说明如下: ob_get_level() will always return 0 inside a destructor. This happens because the garbage collection for output buffe