perl的格式化(Format)报表输出实现代码
发布时间:2022-02-10 09:43:47
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
猜你喜欢
- 本次爬虫思路最最重要的是分析信息接口!!!1. 获取url2. 通过请求拿到响应3. 处理反爬4. 提取信息5. 保存内容本次操练网页htt
- 先来看看js中的Null类型表示什么?null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象,一般一个未定义的变量在初次使用
- 一、引入这段时间一直在学习Python的东西,以前就听说Python爬虫多厉害,正好现在学到这里,跟着小甲鱼的Python视频写了一个爬虫程
- 堆是一棵完全二叉树。堆分为大根堆和小根堆,大根堆是父节点大于左右子节点,并且左右子树也满足该性质的完全二叉树。小根堆相反。可以利用堆来实现优
- #mkdir /mysqldata2、创建/usr/sbin/bakmysql文件#nano /usr/sbin/bakmysql输入:#!
- 安装lxml首先需要pip install lxml安装lxml库。如果你在ubuntu上遇到了以下错误:#include "li
- 根据GB11643-1999公民身份证号码是特征组合码,由十七位数字本体码和一位数字校验码组成,排列顺序从左至右依次为:六位数字地址码八位数
- 在matlab中,存在执行直接得函数来添加高斯噪声和椒盐噪声。Python-OpenCV中虽然不存在直接得函数,但是很容易使用相关的函数来实
- 前言至今,ChatGPT 已经火了很多轮,我在第一轮的时候注册了账号,遗憾的是,没有彻头彻尾好好地体验过一次。最近这一次火爆,ChatGPT
- 前一篇文章《Python 中如何实现参数化测试?》中,我提到了在 Python 中实现参数化测试的几个库,并留下一个问题:它们是如何做到把一
- 一、相关模块jieba:中文分词wordcloud :Python词云库imageio:读取图形数据安装:pip install&
- 作为一个新手,你需要以下3个步骤:1、用户注册 > 2、获取token > 3、调取数据数据内容:包含股票、基金、期货、债券、外
- 摘要:本文主要是在pandas中如何对字符串进行切分。我们考虑一下下面的应用场景。这个是我们的数据集(data),可以看到,数据集中某一列(
- 所使用python环境为最新的3.6版本Python中几种对文件的操作方法:将A文件复制到B文件中去(保持原来格式)读取文件中的内容,返回L
- 何为聚类分析聚类分析或聚类是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象(在某种意义上)与其他组(聚类)中的对象更相似(在某种意
- python启用多线程后,调用exit出现无法退出的情况,原因是exit会抛出Systemexit的异常,如果在exit外围调用了try,就
- 本文实例讲述了Python简单实现自动删除目录下空文件夹的方法。分享给大家供大家参考,具体如下:总是发现电脑用上一段时间,各种软件生成各种目
- 本文实例讲述了php计算函数执行时间的方法。分享给大家供大家参考。具体如下:我们可以通过在程序的前后分别记录开始和结束时间,两个时间差就是程
- 如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件
- enumerate函数用于遍历序列中的元素以及它们的下标。enumerate函数说明:函数原型:enumerate(sequence, [s