📄 perl14.htm
字号:
<blockquote>package mypack;<br>
subroutine mysub {<br>
local ($myvar);<br>
# stuff goes here<br>
}</blockquote>
这里,mysub和myvar都是包mypack的一部分。在包mypack外调用子程序mysub,则要指定包:$mypack'mysub。<br>
可以在子程序中切换包:<br>
<blockquote>package pack1;<br>
subroutine mysub {<br>
$var1 = 1;<br>
package pack2;<br>
$var1 = 2;<br>
}</blockquote>
这段代码创建了两个变量$var1,一个在包pack1中,一个在包pack2中,包中的局域变量只能在其定义的子程序等语句块中使用,像普通的局域变量一样。<br>
<a name=2.7>7、用包定义私有数据</a><br>
包最通常的用途是用在含有子程序和子程序所使用的全局变量的文件中,为子程序定义这样的包,可以保证子程序使用的全局变量不可在其它地方使用,这样的数据即为私有数据。更进一步,可以保证包名不可在其它地方使用。私有数据例:<br>
<blockquote>1 : package privpack;<br>
2 : $valtoprint = 46;<br>
3 :<br>
4 : package main;<br>
5 : # This function is the link to the outside world.<br>
6 : sub printval {<br>
7 : &privpack'printval();<br>
8 : }<br>
9 :<br>
10: package privpack;<br>
11: sub printval {<br>
12: print ("$valtoprint\n");<br>
13: }<br>
14:<br>
15: package main;<br>
16: 1; # return value for require</blockquote>
此子程序只有在调用printval后才能产生输出。<br>
该文件分为两个部分:与外界联系的部分和私有部分。前者为缺省的main包,后者为包privpack。第6~8行定义的子程序printval可被其它程序或子程序调用。printval输出变量$valtoprint的值,此变量仅在包privpack中定义和使用。第15、16行确保其被其它程序用require语句包含后工作正常,15行将当前包设置回缺省包main,16行返回非零值使require不报错。<br>
<a name=2.8>8、包和系统变量</a><br>
下列变量即使从其它包中调用,也在main包中起作用:<br>
<blockquote>
<li>文件变量STDIN, STDOUT, STDERR 和 ARGV</li>
<li>变量%ENV, %INC, @INC, $ARGV 和 @ARGV</li>
<li>其它含有特殊字符的系统变量</li>
</blockquote>
<a name=2.9>9、访问符号表</a><br>
在程序中查找符号表可用数组%_package,此处package为想访问的符号表所属的包名。例如%_main含有缺省的符号表。<br>
通常不需要亲自查找符号表。<br>
<br>
<a name=3>三、模块</a><br>
多数大型程序都分割成多个部件,每一部件通常含有一个或多个子程序及相关的变量,执行特定的一个或多个任务。集合了变量和子程序的部件称为程序模块。<br>
<a name=3.1>1、创建模块</a><br>
Perl 5中用包来创建模块,方法是创建包并将之存在同名的文件中。例如,名为Mymodult的包存贮在文件Mymodult.pm中(扩展名.pm表示Perl
Module)。下例的模块Mymodult含有子程序myfunc1和myfunc2及变量$myvar1和$myvar2。<br>
<blockquote>1 : #!/usr/local/bin/perl<br>
2 :<br>
3 : package Mymodule;<br>
4 : require Exporter;<br>
5 : @ISA = qw(Exporter);<br>
6 : @EXPORT = qw(myfunc1 myfunc2);<br>
7 : @EXPORT_OK = qw($myvar1 $myvar2);<br>
8 :<br>
9 : sub myfunc1 {<br>
10: $myvar1 += 1;<br>
11: }<br>
12:<br>
13: sub myfunc2 {<br>
14: $myvar2 += 2;<br>
15: }</blockquote>
第3~7行是标准的Perl模块定义方式。第3行定义包,第4行包含内置Perl模块Exporter,6、7行进行子程序和变量的输出以与外界联系。第6行创建名为@EXPORT的特殊数组,该数组中的子程序可以被其它程序调用,这里,myfunc1和myfunc2可以被访问。其它任何在模块中定义但没有赋给数组@EXPORT的子程序都是私有的,只能在模块内部调用。第7行创建另一个名为@EXPORT_OK的特殊数组,其中含有可被外部程序访问的变量,这里含有$myvar1和$myvar2。<br>
<a name=3.2>2、导入模块</a><br>
将模块导入你的Perl程序中使用use语句,如下句导入了Mymodule模块:<br>
use Mymodule;<br>
这样,模块Mymodule中的子程序和变量就可以使用了。<br>
取消导入模块使用no语句,如下句取消了Mymodule模块的导入:<br>
no Mymodule;<br>
下面看一个导入模块和取消导入的例子,使用integer模块要求所有数字运算基于整数,浮点数在运算前均被转化为整数。<br>
<blockquote>1: #!/usr/local/bin/perl<br>
2:<br>
3: use integer;<br>
4: $result = 2.4 + 2.4;<br>
5: print ("$result\n");<br>
6:<br>
7: no integer;<br>
8: $result = 2.4 + 2.4;<br>
9: print ("$result\n");</blockquote>
程序输出如下:<br>
<blockquote>$ program<br>
4<br>
4.8<br>
$</blockquote>
如果use或no语句出现在语句块中,则只在该块的有效范围内起作用,如:<br>
<blockquote>use integer;<br>
$result1 = 2.4 + 2.4;<br>
if ($result1 == 4) {<br>
no integer;<br>
$result2 = 3.4 + 3.4;<br>
}<br>
$result3 = 4.4 + 4.4;</blockquote>
结果输出如下:<br>
<blockquote>4<br>
6.8<br>
8</blockquote>
这里,no语句只在if语句中有效,出了if语句仍使用integer模块,因此4.4在做加法前被转化成了4。<br>
<a name=3.3>3、预定义模块</a><br>
Perl 5提供了许多有用的预定义模块,可以用use导入和no语句取消。下面是库中最有用的一些模块:<br>
<p>
<center>
<table border=1>
<tr valign=TOP>
<td>integer</td>
<td>使用整数运算</td>
</tr>
<tr valign=TOP>
<td>Diagnostics </td>
<td>输出较多的诊断信息(警告)</td>
</tr>
<tr valign=TOP>
<td>English</td>
<td>允许英文名用作系统变量的别名</td>
</tr>
<tr valign=TOP>
<td>Env</td>
<td>导入环境变量的Perl模块</td>
</tr>
<tr valign=TOP>
<td>POSIX</td>
<td>POSIX标准(IEEE 1003.1)的Perl接口 </td>
</tr>
<tr valign=TOP>
<td>Socket</td>
<td>装载C语言的套接字处理机制</td>
</tr>
</table>
</center>
<p></p>
Perl文档中有完整的预定义模块列表。<br>
<font color="red">标准模块<br>
下面是所有Perl现行版本(5.004)所附的模块和Pragma:<br>
表B-1 一般程序设计:杂项<br>
模块 功能<br>
autouse 延后载入模块,直到被用到为止<br>
constant 产生编译时常数<br>
Benchmark 检查并比较程序代码的执行时间<br>
Config 存取Perl的配置信息<br>
Env 载人环境变量<br>
English 使用英语或awk的名称代替标点符号<br>
FindBin 寻找目前执行中程序的所在路径<br>
Getopt::Long 命令行参数的延伸处理项目<br>
Getopt::Std 处理单一字符开关<br>
1ib 在编译时处理@INCShell在Perl中透明地执行<br>
Shell 命令<br>
strict 拒绝不安全的结构<br>
Symbol 产生无名glob;检查变量名称<br>
subs 预先声明(predeclare)函数名称<br>
vars 预先声明全局变量名称<br>
表B-2 一般程序设计:错误处理与记录<br>
模块 功能<br>
Carp 产生出错信息<br>
diagnostics 强迫产生详细的警告信息<br>
sigtrap用stack 追踪未预期发生的signal<br>
Sys::Syslog Perl和 UNIX syslob(3)的界面<br>
表B-3 一般程序设计:文件存取与处理<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -