Perl POD 文档介绍
Perl 中可以在模块或脚本中嵌入 POD(Plain Old Documentation) 文档,Pod是一种简单而易用的标记型语言(置标语言),它经常用于在perl程序和模块中的文档编写,是perl的man文档,可以用perldoc输出,也可以直接用man输出。POD 文档使用规则:POD 文档以 =head1 开始, =cut 结束, =head1 前与 =cut 后添加一空行。
Perl 会忽略 POD 中的文档。实例如下:
print "Hello, World\n";
=head1 Hello, World 实例
这是一个 Perl 的简单实例。
=cut
print "Hello, FreeOA\n";
执行以上程序,输出结果为:
Hello, World
Hello, FreeOA
我们还可以使用 "__END__" 或 "__DATA__" 将所在行之后的内容全部"注释"掉:
print "Hello, World\n";
while(<DATA>){
print $_;
}
__END__
=head1 Hello, World 实例
这是一个 Perl 的简单实例。
print "Hello, FreeOA\n";
执行以上程序,输出结果为:
Hello, World
=head1 Hello, World 实例
这是一个 Perl 的简单实例。
print "Hello, FreeOA\n";
以下实例不读取 POD 文档:
print "Hello, World\n";
__END__
=head1 Hello, World 实例
这是一个 Perl 的简单实例。
print "Hello, FreeOA\n";
执行以上程序,输出结果为:
Hello, World
使用指令查看手册页:
$ perldoc Data::Dumper
$ man Data::Dumper
执行perldoc的时候,perldoc会搜索@INC下的Data/Dumper.pm和Data/Dumper.pod文件。
POD文档可以直接嵌入在程序文件内,perldoc会自动对内部的pod部分进行格式化输出,也可以独立写入一个".pod"文件。在嵌入程序文件内的时候,还可以和代码部分交叉,但并不建议这么做。POD嵌入在程序文件中时,建议的做法是将POD放在代码文件的最尾部(如果程序中包含了__DATA__或__END__,则放在它们的后面)。
当写好pod文档后,可以使用podcheck来检查pod文档的语法:
podchecker a.pod
podchecker a.pm
文档的结构
虽说文档可以随便写,但一般来说都遵循一些通用的、约定俗成的规则。一般来说,一个文档中包含以下几项信息:
NAME: 模块名
SYNOPSIS: 概要,使用简单的代码片段描述用法
DESCRIPTION: 描述,介绍模块用来干什么
EXPORT: 这是可选项。用来展示模块的导标签
FUNCTION/METHODS: 详细描述每个子程序/方法
BUGS: 列出bug
AUTHOR: 展示模块的作者
LICENSE: 模块的license条款
COPYRIGHT: 版权信息
除此之外,还有一些结构也可以包括进去,比如VERSION、DIAGNOSTICS、SEE ALSO、CONTRIBUTORS(贡献者一般用于列出那些非作者,但提供了补丁和反馈的人)。
Pod 的 转化器可以将 Pod 转换成很多种格式,例如 text, html, man 等很多。Pod 标记语言包含三种基本基本类型: 普通, 原文和命令。
普通段落: 你可以在普通段落中使用格式化代码,如黑体,斜体,或代码风格,下划线等。
原文段落: 原文段落,用于代码块或者其他不需要转换器处理的部分,而且不需要段落重排。
命令段落: 命令段落作用于整个的文档,通常用于标题设置或列表标记。
所有的命令段落(只有一行的长度)使用 "=" 开始,然后是一个标识符。 随后的文本将被这条命令所影响。现在被广泛使用的命令包括如下,不过文后还有针对这些命令的解释:
=pod (开始文档)
=head1 标题文本
=head2 标题文本
=head3 标题文本
=head4 标题文本
=over 缩进空格数量
=item 前缀
=back (结束列表)
=begin 文档格式
=end 结束文档格式
=for 格式文本
=encoding 编码类型
=cut (文档结束)
Pod 语法
pod中用段分可以分为三种,普通段落,字面段落(Verbatim Paragraph)和命令段落。三者的区分非常简单,以=pod|head1|cut|over等指示字开始的段落为命令段落,以空格或制表符(\t)等缩进开始的段落为字面段落,其余的就是普通段落。
=head1
=head2
=head3
=head4
此四个指示字生产指定级别的标题。pod2html时用其对应的<h1> .. </h4>包围此段落,并且自动生成a的命名/name和索引/index。
=pod
=cut
=pod 只告诉编译器pod文档开始了,而=cut则是pod文档的结束。
=over NUMBER 缩近多少
=item SYMBOL 产生bullet
=back
这三者是连上一起的。=over后面必须要跟一个=back,而这两者之间最少要有一个=item,同时不能有=head1..4。
格式代码
格式代码可以用于除字面段落外的所有段落,包括命令段落。
I<text>
用斜体表示text, 效果如text
B<text>
用粗体表示text, 效果如text
C<code>
pod2html时用<code>包围。
L<text|name>
超链接。
一个典型的示例
一般包括一下几个部分:
=head1 NAME
The name of your program or module.
=head1 SYNOPSIS
A one-line description of what your program or module does (purportedly).
=head1 DESCRIPTION
The bulk of your documentation. (Bulk is good in this context.)
=head1 AUTHOR
Who you are. (Or an alias, if you are ashamed of your program.)
=head1 BUGS
What you did wrong (and why it wasn't really your fault).
=head1 SEE ALSO
Where people can find related information (so they can work around your bugs).
=head1 COPYRIGHT
The copyright statement. If you wish to assert an explicit copyright, you should say something like:
Copyright 2013, Randy Waterhouse. All Rights Reserved.
注意:每个=标签上下必须隔一行,否则就会错误解析。
=for html 或者 =for text
是把下面的单行注视当作html或者text来处理,与其功能类似的是 =begin html / =end html ; =begin text / =end text 两对。begin和end之间可以处理多行。
=over 4
=item SOMEWORD
*************
=item somewordelse
******
=back
以上写法是写一个列表,以over开头,后面的数字是列表中每行的缩进量。最后以=back 结尾。
=cut 是结束pod块的标志,与程序分开。
在perl中,可以使用 pod2html freeoa.pm > freeoa.html 来生成html格式的pod文档。
空行加空格加内容加空行
这个内容再pod2html后就会变成code代码框。
基本上,对于 pod2xxx ("xxx" 可以是 txt, html, latex or man)来说,一个pod 文件只有三种东西:
1. Verbatim Paragraph -- 这种段落以空白或 tab 开始(就是有缩排),段落中的文字不会被转译,例如 '/' 就是 '/'。
2. Command -- pod 的命令是以 '=' 开始,后面接英文字,至于他有哪些命令,会在稍后介绍。
3. 一段文字 -- 与 1. 不同之处在于这里面可以加些类似 "Markup" 的东西,也可以加 link,由 pod2html 帮你处理。后面也会介绍他有哪些功能。
需要注意的是,对于 pod2xxx 这些转译程式来说,上面三种东西最好都是用前后各一行空白来将他们区隔开来。不然转出来的东西,其格式可能不甚符合你的期望。
在perl中,可以使用 pod2html xx.pod >xx.html 来生成html格式的pod文档。
考虑以下 POD 实例:
=begin html
=encoding utf-8
=head1 FreeOA
=cut
使用 pod2html 命令执行,将其转换为 HTML 代码:
$ pod2html freeoa.pod > freeoa.html
在浏览器中打开 freeoa.html,链接部分为索引锚。
以下实例在 POD 文档中直接写入 HTML:
=begin html
=encoding utf-8
<h1>FreeOA</h1>
<p>www.freeoa.net</p>
=end html
encoding和注释
如果文档使用非latin-1或ascii写,比如中文,那么要设置encoding,例如设置为utf-8。
=encoding UTF-8
如果要设置pod的注释,即pod渲染的时候会忽略的内容,需要使用:
= for comment
例如:
=pod
=for comment
DO NOT EDIT. This Pod was generated by Swim v0.1.46.
See http://github.com/ingydotnet/swim-pm#readme
=encoding utf8
使用 pod2html 命令执行,将其转换为 HTML 代码:
$ pod2html freeoa.pod > freeoa.html
在浏览器中打开 freeoa.html,链接部分为索引。
pod2usage 在package中的使用,如果想显示 perl module中的pod,那么采用如下
use Pod::Find qw(pod_where);
pod2usage( -input => pod_where({-inc => 1}, __PACKAGE__));
其中:-inc=>1 表示 Search @INC for the pod and also the scriptdir __PACKAGE__ 表示包文件,如果是A::B 则表示 A/B
pod_where 返回 文件句柄的引用,pod2usage 中default值是 $0, 当前文件而不是包本身。
常用命令解释
总共就十个命令而已:
=head1 heading
=head2 heading
=item text
=over N
=back
=cut
=pod
=for X
=begin X
=end X
1. =headN heading
这看来就知道是用来当标题文字的,后面接的 "heading" 就是此标题名。例如:
=head1 篇名
perlfaq7 - Perl 语言相关问题
=head1 概述
本篇内的问题主要是无法纳入其他部份且与 Perl 语言相关的一般问题。
=head2 我能拿到 Perl 的 BNF/yacc/RE 吗?
转成 html 后还可以自动做出同页连结。可参考 perlfaq 的结果。
2. =item, =over and =back
对于熟悉 HTML 的人来说,这三样分别相当于 <li>, [<ul>|<ol>], [</ul>|</ol>], (这里用正规表示式来描述。)所以要产生一个列表,用 =over 开始,以 =item 铺陈出每个项目,然后用 =back 结尾。请不要在 =over .. =back 这圈圈外使用 =item! =over n 后面的 n 可以用来表示预定的缩排字数,预设为 4。
=item * 表示此列表是没有排顺序的,亦即 unordered list,而 =item 1.,
=item 2. 则是用数字表示,当然 =item foo ,=item bar 也是合法的用法。使用时请注意其一致性。以下即为范例:
=over 4
=item *
第一个项目
=item *
第二个项目
=back
=over 4
=item Foo()
Description of Foo function
=item Bar()
Description of Bar function
=back
3. =cut 和 =pod
这两个是难兄难弟,其实他最大的用途在于当你写 Perl 代码,里面有包含 pod 格式的说明文字时,用 =pod 开头, =cut 结尾包起来的那几段都会被 Perl 直译器给忽略。就这样,跟常看到的 "--- cut here ---" 用法与意义差不多。
4. =for, =begin 和 =end
以 =for 为首的那一段文字(请注意,只有其紧接下来的一段文字而已),会被 pod转译程式忽略,直接送给所指定的 formatter,例如以下就是标明一段 html 文字:
=for html <br>
<P>这是一段 HTML 文件</P>
所以 =for 后面接的就是格式名,目前所接受的格式有(大多都在 Unix 下):"roff", "man", "latex", "tex", "text", 和 "html"。
=begin 和 =end 的用途和 =for 一样,只是他两就相当于担任划清界线的功用,就不只限于一段文字,可以是很多段了... 例如:
=begin html
<br>Figure 1.<IMG SRC="figure1.png"><br>
=end html
=begin text
---------------
| foo |
| bar |
---------------
^^^^ Figure 1. ^^^^
=end text
只要切记,每个段落或命令之间都要用一行空白来隔开,则写 pod 就很简单了。接下来介绍一些类似 HTML 标签的用法:
I<text> 倾斜文字
B<text> 加粗文字
S<text> 包含了连续空白的文字
C<code> 表示一段文字码
L<name> 连结到 "name" 去,用法有以下几种:
L<name> 其他说明文件
L<name/ident> 其他说明文件中的某项目
L<name/"sec"> 其他说明文件中的某段落
L<"sec"> 本文件中的某段落( " 可有可无)
L</"sec"> 同上
F<file> 用来表示档案名
X<index> 表示一索引项目
Z<> 零长度字元
E<escape> 控制字元(相当近似于 html 的 escape character)
E<lt> 代表 <
E<gt> 代表 >
E<n> 第 n 个字元 (ASCII 中的)
E<html> 非数字的 HTML 实体字元,例如 E<Agrave>.
以下节录一段 Perl FAQ Part 7,里面有些用法。
pod文档格式中,有两种内容:段落声明格式和行内格式。
段落声明
段落声明都使用=FLAG表示,=必须顶格写,前面不能有任何空白,FLAG表示开启什么类型的段落,比如是一级标题、二级标题、有序和无序列表等。其中两个特殊的段落声明为:
1.=pod表示此处开始的是pod文档部分
2.=cut表示pod文档到此结束
例如:
sub reciprocal { return 1 / shift }
=pod # 这里表示pod文档段落从此处开始,下面属于pod文档
This is a paragraph in a POD section. When run through a formatter, the
paragraph text will rewrap as necesseary to fit the needs of your
particular output format.
=cut # 这里表示pod文档段落到此结束,下面不属于pod文档
sub not_reciprocal { return shift }
常见的段落声明有以下几种:
=pod
=cut
=head1 Heading Text # 标题
=head2 Heading Text
=head3 Heading Text
=head4 Heading Text
=over indentlevel # 列表
=item stuff
=back
=begin format # 格式,见官方手册
=end format
=for format text...
=encoding type # 编码类型
其中列表由=over NUM开始,NUM表示列表的缩进程度,由=back结束列表。有无序列表和有序列表两种形式。例如:
=over 4
=item * This is a list item
=item * This is a second list item.
This is an optional paragraph explaining the second list item.
=back
=over 4
=item 1. This is a list item
=item 2. This is a second list item.
This is an optional paragraph explaining the second list item.
=item 3.
=back
行内格式
行内格式一般是行内代码、加粗、斜体、链接等。
格式 意义
------------ -----------------
C<text> 代码
C<< text >> 代码段中保留大于号和小于号( C<< $age >= 18 >> )
B<text> 加粗
I<text> 斜体
E<text> 转义的HTML,例如可以使用E<lt>表示小于号(<)
S<text> All ‘s’paces are nonbreaking
L<text> 链接
主要解释下生成链接的方式。支持3种链接方式:链接到另一个文档、链接到另一个文档的某一小节,连接到本文档的某小节以及链接到某个URL:
L<name>:连接到另一个文档。例如L<Scalar::Util>、L<perlunitut>,注意链接的名称中不能有空格
L<name/"sec">或L<name/sec>:连接到另一个文档的某一小节,例如L<perlpod/"Formatting Codes">
L</"sec">或L</sec>:链接到本文档的某个小节
L<URL>:链接到某个URL,例如L<http://www.freeoa.net/>
注意:E<lt>FILEE<gt> I<不是> 用来指定档案的形态,亦非此把手的名字。它只是将C<E<lt>E<gt>> 运算子用在 FILE 把手上。它自 FILE 把手读入一行 (嗯,该说一笔记录,参看 L<perlvar/$/>) 当作纯量变数的内容,或读入 I<全部> 当作阵列变数的内容。当使用开、关或其它 C<E<lt>E<gt>> 之外的动作于档案上,或甚至只是提到把手时,切记 I<不要> 使用 C<E<lt>E<gt>>。下面的用法是正确的:C<eof(FH)>,C<seek(FH, 0,2)>以及 "copying from STDIN to FILE"。
这里面用到了 E<>, I<>, C<>, 及 L<>,算是个不错的范例。
Okay, 整个 POD 的命令与格式就是这么简单。目前进行中的 Perl FAQ 中文翻译都是直接翻 pod 档,再交给 hsiao 先生转成 html 格式。是还没有什么大问题。所以若要省去发展格式与转换程式的时间,那或许采用 pod 是个不错的主意。 By the way,pod 的作者当然是 Larry Wall,可以再参考 perlpod 的文件。
另外一个另类的用法就是《perl 多行注释》。