格式化输出
Perl 是一个非常强大的文本数据处理语言。Perl 中可以使用 format 来定义一个模板,然后使用 write 按指定模板输出数据。Perl 格式化定义语法格式如下
|
|
参数解释:
|
|
看一个简单的案例:
|
|
格式行语法
- 格式行以
@
或者^
开头,这些行不作任何形式的变量代换。 @
字段(不要同数组符号@
相混淆)是普通的字段。@,^
后的<, >,|
长度决定了字段的长度,如果变量超出定义的长度,那么它将被截断。<, >,|
还分别表示,左对齐,右对齐,居中对齐。^
字段用于多行文本块填充。
值域格式
格式 | 值域含义 | |||
---|---|---|---|---|
@<<< |
左对齐输出 | |||
@>>> |
右对齐输出 | |||
`@ | ` | 中对齐输出 | ||
@##.## |
固定精度数字 | |||
@* |
多行文本 |
每个值域的第一个字符是行填充符,当使用@
字符时,不做文本格式化。在上表中,除了多行值域@*
,域宽都等于其指定的包含字符@
在内的字符个数,例如@###.##
表示7个字符的宽度,小数点前4个,小数点后2个,如下所示:
|
|
格式变量
$~ ($FORMAT_NAME)
:格式名字;$^ ($FORMAT_TOP_NAME)
:当前的表头格式名字存储;$% ($FORMAT_PAGE_NUMBER)
:当前输出的页号;$= ($FORMAT_LINES_PER_PAGE)
:每页中的行数;$| ($FORMAT_AUTOFLUSH)
:是否自动刷新输出缓冲区存储;$^L ($FORMAT_FORMFEED)
:在每一页(除了第一页)表头之前需要输出的字符串存储。
在下面的案例中,使用了$~进行格式化,
案例如下所示:
|
如果不指定$~
的情况下,会输出名为STDOUT
的格式,如下所示:
|
|
在下面的案例中,添加报表头部信息来说明$^
或$FORMAT_TOP_NAME
变量的使用:
|
|
输出到其它文件
默认情况下函数write
将结果输出到标准输出文件STDOUT
,我们也可以使它将结果输出到任意其它的文件中。最简单的方法就是把文件变量作为参数传递给write
,例如write(MYFILE)
,此时write就用缺省的名为MYFILE的打印格式输出到文件MYFILE中。但是这样就不能用$~
变量来改变所使用的打印格式。系统变量$~
只对默认文件变量起作用,我们可以改变默认文件变量,改变$~
,再调用write
,如下所示:
|
|
以使用select
改变默认文件变量时,它返回当前默认文件变量的内部表示,这样我们就可以创建子程序,按自己的想法输出,又不影响程序的其它部分,如下所示:
|
|
Perl中处理时间的函数
Perl中处理时间的函数有以下这些:
- time() 函数:返回从1970年1月1日起累计的秒数
- localtime() 函数:获取本地时区时间
- gmtime() 函数: 获取格林威治时间
当前时间和日期
localtime()
函数返回当前的时间和日期。
以下 9 个符号代表不同的时间日期参数:
|
|
使用案例如下所示:
|
|
如果直接调用 localtime() ,它返回系统当期设置时区的时间,如下所示:
|
|
格林威治时间 (GMT)
函数 gmtime() 与 localtime() 类似,但它返回标准格林威治时间,如下所示:
运行结果可以看出,中国当地时间和格林威治时间相差了8小时,中国是东八区。
格式化日期和时间
使用localtime()
函数的 9 个时间元素来可以输出需要制定的格式时间。格式化输出使用 printf() 函数,如下所示:
新纪元时间(Epoch Time)
使用 time() 函数来获取新纪元时间,该函数返回从1970年1月1日起累计的秒数,如下所示:
|
|
也可以输出一个用户想要的时间格式,如下所示:
POSIX 函数 strftime()
函数strftime()
可以将时间格式化为我们想要的格式。
下表列出了一些格式化的符号,*
号表示想要依赖本地时间:
符号 | 描述 | 实例 |
---|---|---|
%a | 星期几的简称( Sun..Sat) * |
Thu |
%A | 星期几的全称( Sunday..Saturday) * |
Thursday |
%b | 月的简称(Jan..Dec) * |
Aug |
%B | 月的全称(January..December) * |
August |
%c | 日期和时间 * | Thu Aug 23 14:55:02 2001 |
%C | 年份除于100,并取整 (00-99) | 20 |
%d | 一个月的第几天 (01-31) | 23 |
%D | 日期, MM/DD/YY 相等于%m/%d/%y | 08/23/01 |
%e | 一个月的第几天,使用空格填充个位数 ( 1-31) | 23 |
%F | YYYY-MM-DD 的简写类似于 %Y-%m-%d | 2001/8/23 |
%g | 年份的最后两位数 (00-99) | 1 |
%g | 年 | 2001 |
%h | 月的简称 * (和%b选项相同) |
Aug |
%H | 24 小时制 (00-23) | 14 |
%I | 12 小时制 (01-12) | 02 |
%j | 一年的第几天 (001-366) | 235 |
%m | 月 (01-12) | 08 |
%M | 分钟 (00-59) | 55 |
%n | 新行 (‘\n’) | |
%p | 显示出AM或PM | PM |
%r | 时间(hh:mm:ss AM或PM),12小时 * |
02:55:02 pm |
%R | 24 小时 HH:MM 时间格式,相等于 %H:%M | 14:55 |
%S | 秒数 (00-61) | 02 |
%t | 水平制表符 (‘\t’) | |
%T | 时间(24小时制)(hh:mm:ss),相等于%H:%M:%S | 14:55 |
%u | ISO 8601 的星期几格式,星期一为1 (1-7) | 4 |
%U | 一年中的第几周,星期天为第一天(00-53) | 33 |
%V | ISO 8601 第几周 (00-53) | 34 |
%w | 一个星期的第几天(0代表星期天) (0-6) | 4 |
%W | 一年的第几个星期,星期一为第一天 (00-53) | 34 |
%x | 显示日期的格式(mm/dd/yy) * |
08/23/01 |
%X | 显示时间格式 * |
14:55:02 |
%y | 年,两位数 (00-99) | 01 |
%Y | 年 | 2018 |
%z | ISO 8601与UTC的时区偏移(1 minute=1, 1 hour=100) | +100 |
%Z | 当前时区的名称,如”中国标准时间” * |
CDT |
%% | % 符号 | % |
使用案例如下所示:
|
|