📄 perl14.htm
字号:
$var = 21; #error - no current package<br>
这种情况直到用package语句指定当前包为止。<br>
<a name="2.6">6、包和子程序</a><br>
包的定义影响到程序中的所有语句,包括子程序,如:<br>
<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>
Perl文档中有完整的预定义模块列表。<br>
注:世界各地的Perl 5用户写了许多有用的模块,CPAN(Comprehensive Perl Archive Network)的Perl文档有其完整的列表。关于CPAN的更多信息见其网址:<a target="_blank" href="http://www.perl.com/perl/CPAN/README.html">http://www.perl.com/perl/CPAN/README.html</a>。<br>
<p align="center"><a href="perl13.htm">上一章</a> <a href="func.htm">下一章</a> <a href="index.htm">目录</a></p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -