一、require函数
用require函数可以把程序分割成多个文件并创建函数库。例如,在myfile.pl中有定义好的perl函数,可用语句require ("myfile.pl"); 在程序中包含进来。当perl解释器看到这一语句,就在内置数组变量@inc指定的目录中寻找文件myfile.pl。如果找到了,该文件中的语句就被执行,否则程序终止并输出错误信息:
can't find myfile.pl in @inc
作为子程序调用参数,文件中最后一个表达式的值成为返回值,require函数查看其是否为零,若为零则终止。例如myfile.pl最后的语句是:
print ("hello, world!\n");
$var = 0;
因为最后的语句值为零,perl解释器输出下列错误信息并推出:
myfile.pl did not reture true value
可以用简单变量或数组元素等向require传递参数,如:
@reqlist = ("file1.pl", "file2.pl", "file3.pl");还可以不指定文件名,即:
require ($reqlist[$0]);
require ($reqlist[$1]);
require ($reqlist[$2]);
a、确定存贮子程序库的目录例如:假设目录/u/perldir中存有你的perl子程序库,子程序mysub存贮在文件mysub.pl中。现在来包含上该文件:
b、将子程序抽取放到单独的文件中,将文件放到子程序库目录
c、每个文件末尾加一句非零值的语句,最简单的办法是语句 1;
d、在主程序中用require包含一个或多个所需的文件。
e、运行主程序时,用 -i 选项指定子程序库目录,或者在调用require前将该目录添加到@inc数组中。
1、应该使用unshift来向@inc中添加目录,而不是push。因为push增加到@inc的末尾,则该目录将被最后搜寻。2、用require指定perl版本
2、如果你的库文件名与/usr/local/lib/perl中的某文件同名,则不会被包含进来,因为require只包含同名文件中的第一个。
$var = 14;第一个语句创建变量$var并存贮在main符号表中,第三个语句创建另一个同名变量$var并存贮在mypack包的符号表中。
package mypack;
$var = 6;
1: #!/usr/local/bin/perl运行结果如下:
2:
3: package pack1;
4: $var = 26;
5: package pack2;
6: $var = 34;
7: package pack1;
8: print ("$var\n");
$ program第三行定义了包pack1,第四行创建变量$var,存贮在包pack1的符号表中,第五行定义新包pack2,第六行创建另一个变量$var,存贮在包pack2的符号表中。这样就有两个独立的$var,分别存贮在不同的包中。第七行又指定pack1为当前包,因为包pack1已经定义,这样,所有变量和子程序的定义和调用都为该包的符号表中存贮的名字。因此第八行对$var的调用为pack1包中的$var,其值为26。
26
$
package mypack;这里,$mypack'var为mypack包中的变量$var。
$var = 26;
package main;
print ("$mypack'var\n");
package mypack;这里,mysub和myvar都是包mypack的一部分。在包mypack外调用子程序mysub,则要指定包:$mypack'mysub。
subroutine mysub {
local ($myvar);
# stuff goes here
}
package pack1;这段代码创建了两个变量$var1,一个在包pack1中,一个在包pack2中,包中的局域变量只能在其定义的子程序等语句块中使用,像普通的局域变量一样。
subroutine mysub {
$var1 = 1;
package pack2;
$var1 = 2;
}
1 : package privpack;此子程序只有在调用printval后才能产生输出。
2 : $valtoprint = 46;
3 :
4 : package main;
5 : # this function is the link to the outside world.
6 : sub printval {
7 : &privpack'printval();
8 : }
9 :
10: package privpack;
11: sub printval {
12: print ("$valtoprint\n");
13: }
14:
15: package main;
16: 1; # return value for require
9、访问符号表
·文件变量stdin, stdout, stderr 和 argv
·变量%env, %inc, @inc, $argv 和 @argv
·其它含有特殊字符的系统变量
1 : #!/usr/local/bin/perl第3~7行是标准的perl模块定义方式。第3行定义包,第4行包含内置perl模块exporter,6、7行进行子程序和变量的输出以与外界联系。第6行创建名为@export的特殊数组,该数组中的子程序可以被其它程序调用,这里,myfunc1和myfunc2可以被访问。其它任何在模块中定义但没有赋给数组@export的子程序都是私有的,只能在模块内部调用。第7行创建另一个名为@export_ok的特殊数组,其中含有可被外部程序访问的变量,这里含有$myvar1和$myvar2。
2 :
3 : package mymodule;
4 : require exporter;
5 : @isa = qw(exporter);
6 : @export = qw(myfunc1 myfunc2);
7 : @export_ok = qw($myvar1 $myvar2);
8 :
9 : sub myfunc1 {
10: $myvar1 += 1;
11: }
12:
13: sub myfunc2 {
14: $myvar2 += 2;
15: }
1: #!/usr/local/bin/perl程序输出如下:
2:
3: use integer;
4: $result = 2.4 + 2.4;
5: print ("$result\n");
6:
7: no integer;
8: $result = 2.4 + 2.4;
9: print ("$result\n");
$ program如果use或no语句出现在语句块中,则只在该块的有效范围内起作用,如:
4
4.8
$
use integer;结果输出如下:
$result1 = 2.4 + 2.4;
if ($result1 == 4) {
no integer;
$result2 = 3.4 + 3.4;
}
$result3 = 4.4 + 4.4;
4这里,no语句只在if语句中有效,出了if语句仍使用integer模块,因此4.4在做加法前被转化成了4。
6.8
8
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器