perl 问题: 怎么得到调用perl 函数调用者的相关信?

Perl子过程(子函数)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
56页免费15页免费12页免费12页免费6页免费 4页免费11页免费24页1下载券9页免费2页免费
喜欢此文档的还喜欢5页免费5页免费26页免费48页免费18页免费
Perl子过程(子函数)|p​e​r​l​子​过​程​(​子​函​数​)​
​
. ​语​法​ ​
​
. ​语​意​ ​
​
. ​参​数​列​表​的​技​巧​ ​
​
. ​错​误​指​示​ ​
​
. ​范​围​问​题​ ​
​
. ​传​入​引​用​ ​
​
. ​函​数​原​型​ ​
​
. ​内​联​常​量​函​数​ ​
​
. ​谨​慎​使​用​函​数​原​型​ ​
​
. ​子​过​程​属​性​ ​
​
. ​L​o​c​k​e​d​ ​和​ ​m​e​t​h​o​d​ ​属​性​ ​
​
. ​左​值​属​性
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢PERL编程24学时教程――08 函数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
286页免费12页免费12页免费13页免费12页免费 10页免费13页免费11页免费13页免费12页免费
喜欢此文档的还喜欢11页免费12页免费12页免费13页免费11页免费
PERL编程24学时教程――08 函数|本​书​循​序​渐​进​、​深​入​浅​出​地​介​绍​了​P​e​r​l​的​主​要​特​性​及​用​P​e​r​l​进​行​C​G​I​编​程​的​知​识​。​全​书​包​括4​个​学​时​内​容​和​一​个​附​录​,​共​分​四​部​分​。​第​一​部​分​主​要​讲​述​P​e​r​l​的​基​本​概​念​,​第​二​部​分​重​点​介​绍​P​e​r​l​的​一​些​高​级​特​性​,​第​三​部​分​介​绍​如​何​使​用​P​e​r​l​进​行​C​G​I​编​程​,​第​四​部​分​(​即​附​录​)​讲​述​如​何​在​不​同​的​操​作​系​统​下​安​装​P​e​r​l​的​各​个​模​块​。​ ​本​书​结​构​清​晰​,​讲​解​透​彻​,​通​俗​易​懂​,​对​于​P​e​r​l​用​户​来​说​是​一​本​非​常​实​用​的​入​门​参​考​书​。
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢您所在的位置: &
构造函数中Perl方法用法解析
构造函数中Perl方法用法解析
Perl语言中Perl方法的概念你是否了解,这里向大家简单介绍一下,Perl类的Perl方法只不过是一个Perl子程序而已,也即通常所说的成员函数。
本文和大家重点讨论一下Perl方法的概念,Perl方法定义不提供任何特殊语法,但规定Perl方法的第一个参数为对象或其被引用的包。Perl有两种Perl方法:静态Perl方法和虚Perl方法。
一、Perl方法简介
Perl类的Perl方法只不过是一个Perl子程序而已,也即通常所说的成员函数。Perl方法定义不提供任何特殊语法,但规定Perl方法的第一个参数为对象或其被引用的包。Perl有两种Perl方法:静态Perl方法和虚Perl方法。
静态Perl方法第一个参数为类名,虚Perl方法第一个参数为对象的引用。Perl方法处理第一个参数的方式决定了它是静态的还是虚的。静态Perl方法一般忽略掉第一个参数,因为它们已经知道自己在哪个类了,构造函数即静态Perl方法。虚Perl方法通常首先把第一个参数shift到变量self或this中,然后将该值作普通的引用使用。如:
1.subnameLister{ &2.my$this=shift; &3.my($keys,$value); &4.while(($key,$value)=each(%$this)){ &5.print&\t$keyis$value.\n&; &6.} &7.} &&
二、Perl方法的输出
如果你现在想引用Cocoa.pm包,将会得到编译错误说未找到Perl方法,这是因为Cocoa.pm的Perl方法还没有输出。输出Perl方法需要Exporter模块,在包的开始部分加上下列两行:
@ISA=qw(Exporter);
这两行包含上Exporter.pm模块,并把Exporter类名加入@ISA数组以供查找。接下来把你自己的类Perl方法列在@EXPORT数组中就可以了。例如想输出Perl方法closeMain和declareMain,语句如下:
@EXPORT=qw(declareMain,closeMain);
Perl类的继承是通过@ISA数组实现的。@ISA数组不需要在任何包中定义,然而,一旦它被定义,Perl就把它看作目录名的特殊数组。它与@INC数组类似,@INC是包含文件的寻找路径。@ISA数组含有类(包)名,当一个Perl方法在当前包中未找到时就到@ISA中的包去寻找。@ISA中还含有当前类继承的基类名。
类中调用的所有Perl方法必须属于同一个类或@ISA数组定义的基类。如果一个Perl方法在@ISA数组中未找到,Perl就到AUTOLOAD()子程序中寻找,这个可选的子程序在当前包中用sub定义。若使用AUTOLOAD子程序,必须用useA语句调用autoload.pm包。AUTOLOAD子程序尝试从已安装的Perl库中装载调用的Perl方法。如果AUTOLOAD也失败了,Perl再到UNIVERSAL类做最后一次尝试,如果仍失败,Perl就生成关于该无法解析函数的错误。
三、Perl方法的调用
调用一个对象的Perl方法有两种Perl方法,一是通过该对象的引用(虚Perl方法),一是直接使用类名(静态Perl方法)。当然该Perl方法必须已被输出。
现在,我们写一个简单的Perl脚本来使用该类的Perl方法,下面是创建一个Javaapplet源代码骨架的脚本代码:
#!/usr/bin/perl &useC &$cup=newCocoa; &$cup-setImports('java.io.InputStream','java.net.*'); &$cup-declareMain(&Msg&,&java.applet.Applet&,&Runnable&); &$cup-closeMain(); &&这段脚本创建了一个叫做Msg的Javaapplet,它扩展(extend)了java.applet.Applet小应用程序并使之可运行(runnable),其中最后三行也可以写成如下: &Cocoa::setImports($cup,'java.io.InputStream','java.net.*'); &Cocoa::declareMain($cup,&Msg&,&java.applet.Applet&,&Runnable&); &Cocoa::closeMain($cup); &其运行结果如下: &/* &**CreatedbyCocoa.pm &**Useatownrisk &*/ &importjava.io.InputS &importjava.net.*; &&publicclassMsgextendsjava.applet.AppletimplementsRunnable{ &} &&
注意:如果用-&操作符调用Perl方法(也叫间接调用),参数必须用括号括起来,如:$cup-&setImports('java.io.InputStream','java.net.*');而双冒号调用如:Cocoa::setImports($cup,'java.io.InputStream','java.net.*');也可去掉括号写成:Cocoa::setImports$cup,'java.io.InputStream','java.net.*';
有时需要指定使用哪个类的Perl方法,如两个不同的类有同名Perl方法的时候。假设类Espresso和Qava都定义了Perl方法grind,可以用::操作符指定使用Qava的Perl方法:
$mess=Qava::grind(&whole&,&lotta&,&bags&);
Qava::grind($mess,&whole&,&lotta&,&bags&);
可以根据程序的运行情况来选择使用哪个类的Perl方法,这可以通过使用符号引用去调用来实现:
$method=$local?&Qava::&:&Espresso::&;
$cup-&{$method}grind(@args);
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
Angular.js 是一个MV*(Model-View-Whatever,不管是MVC或者MVVM
本次的专刊为大家提供了Oracle最新推出的Java SE 8详细的开发教程,从解读到探究Java 8最新
MongoDB的转变也正是10gen的转变,Dwight Merriman在
在过去的近十年的时间里,面向对象编程大行其道。以至
很久很久以前,冬天爱上了夏天,可是他们始终不能相见
本书全面深入地介绍网络安全的配置与实现技术,包括系统管理、用户账户、病毒防御、灾难恢复、文件备份、安全策略、注册表等服务
51CTO旗下网站2515人阅读
一、进程处理函数
1、进程启动函数
函数名 eval调用语法 eval(string)解说 将string看作Perl语句执行。正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息。例子 $print = "print (/"hello,world//n/");";eval ($print);结果输出 hello, world
函数名 system调用语法 system(list)解说 list中第一个元素为程序名,其余为参数。system启动一个进程运行程序并等待其结束,程序结束后错误代码左移八位成为返回值。例子 @proglist = ("echo", "hello,world!");system(@proglist);结果输出 hello, world!
函数名 fork调用语法 procid = fork();解说 创建程序的两个拷贝--父进程和子进程--同时运行。子进程返回零,父进程返回非零值,此值为子程序的进程ID号。例子 $retval = fork();if ($retval == 0) {# this is the child process # this terminates the child process} else {# this is the parent process}结果输出 无
函数名 pipe调用语法 pipe (infile, outfile);解说 与fork合用,给父进程和子进程提供通信的方式。送到outfile文件变量的信息可以通过infile文件变量读取。步骤:1、调用pipe2、用fork将程序分成父进程和子进程3、一个进程关掉infile,另一个关掉outfile例子 pipe (INPUT, OUTPUT);$retval = fork();if ($retval != 0) {# this is the parent processclose (INPUT);print ("Enter a line of input:/n");$line = &STDIN&;print OUTPUT ($line);} else {# this is the child processclose (OUTPUT);$line = &INPUT&;print ($line);exit (0);}结果输出 $programEnter a line of input:Here is a test lineHere is a test line$
函数名 exec调用语法 exec (list);解说 与system类似,区别是启动新进程前结束当前程序。常与fork合用,当fork分成两个进程后,子进程用exec启动另一个程序。例子 结果输出
函数名 syscall调用语法 syscall (list);解说 调用系统函数,list第一个元素是系统调用名,其余为参数。如果参数是数字,就转化成C的整型数(type int)。否则传递字符串的指针。详见UNIX的帮助或Perl文档。使用syscall必须包含文件syscall.pl,即:require ("syscall.pl");例子 结果输出 2、进程终止函数
函数名 die调用语法 die (message);解说 终止程序并向STDERR输出错误信息。message可以为字符串或列表。如果最后一个参数不包含换行符,则程序文件名和行号也被输出。例子 die ("Cannot open input file");结果输出 Cannot open input file at myprog line 6.
函数名 warn调用语法 warn (message);解说 与die类似,区别是不终止程序。例子 warn("Danger! Danger!/n");结果输出 Danger! Danger!
函数名 exit调用语法 exit (retcode);解说 终止程序并指定返回值。例子 exit(2);结果输出 无
函数名 kill调用语法 kill (signal, proclist);解说 给一组进程发送信号。signal是发送的数字信号,9为杀掉进程。proclist是进程ID列表。详见kill的UNIX帮助。例子 结果输出 3、进程控制函数
函数名 sleep调用语法 sleep (time);解说 将程序暂停一段时间。time是停止的秒数。返回值为实际停止的秒数。例子 sleep (5);结果输出 无
函数名 wait调用语法 procid = wait();解说 暂停程序执行,等待子进程终止。不需要参数,返回值为子进程ID,如果没有子进程,返回-1。例子 结果输出
函数名 waitpid调用语法 waitpid (procid, waitflag);解说 暂停程序执行,等待特定的子进程终止。procid为等待的进程ID例子 $procid = fork();if ($procid == 0) {# this is the child processprint ("this line is printed first/n");exit(0);} else {# this is the parent processwaitpid ($procid, 0);print ("this line is printed last/n");}结果输出 $ programthis line is printed firstthis line is printed last$4、其它控制函数
函数名 caller调用语法 subinfo = caller();解说 返回调用者的程序名和行号,用于Perl Debugger。返回值为三元素的列表:1、调用处的包名2、调用者文件名3、调用处的行号例子 结果输出
函数名 chroot调用语法 chroot (dir);解说 改变程序的根目录,详见chroot帮助。例子 结果输出
函数名 local调用语法 local($variable);解说 在语句块(由大括号包围的语句集合)中定义局域变量,仅在此语句块中起作用,对其的改变不对块外同名变量造成影响。千万不要在循环中使用,否则每次循环都定义一个新的局域变量!例子 结果输出
函数名 times调用语法 timelist = times解说 返回该程序及所有子进程消耗的工作时间。返回值为四个浮点数的列表:1、程序耗用的用户时间2、程序耗用的系统时间3、子进程耗用的用户时间4、子进程耗用的系统时间例子 结果输出 二、数学函数
函数名 sin调用语法 retval = sin (value);解说 参数为弧度值。
函数名 cos调用语法 retval = cos (value);解说 参数为弧度值。
函数名 atan2调用语法 retval = atan2 (value1, value2);解说 运算并返回value1除以value2结果的arctan值,单位为弧度,范围在-PI~PI。应用例:角度转化成弧度子程序。 sub degrees_to_radians {local ($degrees) = @_;local ($radians);11:$radians = atan2(1,1) * $degrees / 45;}
函数名 sqrt调用语法 retval = sqrt (value);解说 平方根函数。value为非负数。
函数名 exp调用语法 retval = exp (value);解说 返回e的value次方。
函数名 log调用语法 retval = log (value);解说 以e为底的自然对数。
函数名 abs调用语法 retval = abs (value);解说 绝对值函数。(Perl 4中没有)
函数名 rand调用语法 retval = rand (num);解说 随机数函数,返回0和整数num之间的一个浮点数。
函数名 srand调用语法 srand (value);解说 初始化随机数生成器。保证每次调用rand真正随机。三、字符串处理函数
函数名 index调用语法 position = index (string, substring, position);解说 返回子串substring在字符串string中的位置,如果不存在则返回-1。参数position是可选项,表示匹配之前跳过的字符数,或者说从该位置开始匹配。
函数名 rindex调用语法 position = rindex (string, substring, position);解说 与index类似,区别是从右端匹配。
函数名 length调用语法 num = length (string);解说 返回字符串长度,或者说含有字符的数目。
函数名 pos调用语法 offset = pos(string);解说 返回最后一次模式匹配的位置。
函数名 substr调用语法 substr (expr, skipchars, length)解说 抽取字符串(或表达式生成的字符串)expr中的子串,跳过skipchars个字符,或者说从位置skipchars开始抽取子串(第一个字符位置为0),子串长度为length,此参数可忽略,意味着取剩下的全部字符。当此函数出现在等式左边时,expr必须为变量或数组元素,此时其中部分子串被等式右边的值替换。
函数名 study调用语法 study (scalar);解说 用一种内部格式提高变量的访问速度,同一时刻只对一个变量起作用。
函数名 lcuc调用语法 retval = lc(string);retval = uc(string);解说 将字符串全部转换成小/大写字母。
函数名 lcfirstucfirst调用语法 retval = lcfirst(string);retval = ucfirst(string);解说 将第一个字母转换成小/大写。
函数名 quotameta调用语法 newstring = quotemeta(oldstring);解说 将非单词的字母前面加上反斜线(/)。语句 : $string = quotemeta($string);等效于:$string =~ s/(/W)///$1/g;常用于模式匹配操作中,确保字符串中没有字符被看作匹配操作符。
函数名 join调用语法 join (joinstr, list);解说 把字符串列表(数组)组合成一个长的字符串,在每两个列表元素间插入串joinstr。
函数名 sprintf调用语法 sprintf (string, fields);解说 与printf类似,区别是结果不输出到文件,而作为返回值赋给变量。例子 $num = 26;$outstr = sprintf("%d = %x hexadecimal or %o octal/n",$num, $num, $num);print ($outstr);结果输出 26 = 1a hexadecimal or 32 octal四、标量转换函数
函数名 chop调用语法 $lastchar = chop (var);解说 var可为变量或数组,当var为变量时,最后一个字符被删除并赋给$lastchar,当var为数组/列表时,所有元素的最后一个字符被删除,最后一个元素的最后一个字母赋给$lastchar。
函数名 chomp调用语法 result = chomp(var);解说 检查字符串或字符串列表中元素的最后一个字符是否为由系统变量$/定义的行分隔符,如果是就删除。返回值为实际删除的字符个数。
函数名 crypt调用语法 result = crypt (original, salt);解说 用DES算法加密字符串,original是将要加密的字符串,salt是两个字符的字符串,定义如何改变DES算法,以使更难解码。返回值为加密后的串。
函数名 hex调用语法 decnum = hex (hexnum);解说 将十六进制数(字符串形式)转化为十进制数。
函数名 int调用语法 intnum = int (floatnum);解说 将浮点数舍去小数部分转化为整型数。
函数名 oct调用语法 decnum = oct (octnum);解说 将八进制数(字符串形式)或十六进制数("0x.."形式)转化为十进制数。
函数名 ord调用语法 asciival = ord (char);解说 返回单个字符的ASCII值,与PASCAL中同名函数类似。
函数名 chr调用语法 $char = chr (asciival);解说 返回ASCII值的相应字符,与PASCAL中同名函数类似。
函数名 pack调用语法 formatstr = pack(packformat, list);解说 把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中。参数packformat包含一个或多个格式字符,列表中每个元素对应一个,各格式字符间可用空格或tab隔开,因为pack忽略空格。除了格式a、A和@外,重复使用一种格式多次可在其后加个整数,如:&& $twoints = pack ("i2", 103, 241);把同一格式应用于所有的元素则加个*号,如:&& $manyints = pack ("i*", 14, 26, 11, 83);对于a和A而言,其后的整数表示要创建的字符串长度,重复方法如下:&& $strings = pack ("a6" x 2, "test1", "test2");格式@的情况比较特殊,其后必须加个整数,该数表示字符串必须的长度,如果长度不够,则用空字符(null)补足,如:&& $output = pack ("a @6 a", "test", "test2");pack函数最常见的用途是创建可与C程序交互的数据,例如C语言中字符串均以空字符(null)结尾,创建这样的数据可以这样做:&& $Cstring = pack ("ax", $mystring);下表是一些格式字符与C中数据类型的等价关系:字符&& 等价C数据类型C chard doublef floati intI unsigned int (or unsigned)l longL unsigned longs shortS unsigned short完整的格式字符见下表。
格式字符&& 描述a 用空字符(null)补足的字符串A 用空格补足的字符串b 位串,低位在前B 位串,高位在前c 带符号字符(通常-128~127)C 无符号字符(通常8位)d 双精度浮点数f 单精度浮点数h 十六进制数串,低位在前H 十六进制数串,高位在前i 带符号整数I 无符号整数l 带符号长整数L 无符号长整数n 网络序短整数N 网络序长整数p 字符串指针s 带符号短整数S 无符号短整数u 转化成uuencode格式v VAX序短整数V VAX序长整数x 一个空字节X 回退一个字节@ 以空字节(null)填充
函数名 unpack调用语法 @list = unpack (packformat, formatstr);解说 unpack与pack功能相反,将以机器格式存贮的值转化成Perl中值的列表。其格式字符与pack基本相同(即上表),不同的有:A格式将机器格式字符串转化为Perl字符串并去掉尾部所有空格或空字符;x为跳过一个字节;@为跳过一些字节到指定的位置,如@4为跳过4个字节。下面看一个@和X合同的例子:&&& $longrightint = unpack ("@* X4 L", $packstring);此语句将最后四个字节看作无符号长整数进行转化。下面看一个对uuencode文件解码的例子:
&&& 1 : #!/usr/local/bin/perl&&& 2 :&&& 3 : open (CODEDFILE, "/u/janedoe/codefile") ||&&& 4 : die ("Can't open input file");&&& 5 : open (OUTFILE, "&outfile") ||&&& 6 : die ("Can't open output file");&&& 7 : while ($line = &CODEDFILE&) {&&& 8 : $decoded = unpack("u", $line);&&& 9 : print OUTFILE ($decoded);&&& 10: }&&& 11: close (OUTFILE);&&& 12: close (CODEDFILE);
当将pack和unpack用于uuencode时,要记住,虽然它们与UNIX中的uuencode、uudecode工具算法相同,但并不提供首行和末行,如果想用uudecode对由pack的输出创建的文件进行解码,必须也把首行和末行输出(详见UNIX中uuencode帮助)。
函数名 vec调用语法 retval = vec (vector, index, bits);解说 顾名思义,vec即矢量(vector)函数,它把简单变量vector的值看作多块(维)数据,每块含一定数目的位,合起来即一个矢量数据。每次的调用访问其中一块数据,可以读取,也可以写入。参数index就象数组下标一样,提出访问哪一块,0为第一块,依次类推,要注意的是访问次序是从右到左的,即第一块在最右边。参数bits指定每块中的位数,可以为1,2,4,8,16或32。例子 1 : #!/usr/local/bin/perl2 :3 : $vector = pack ("B*", "");4 : $val1 = vec ($vector, 0, 4);5 : $val2 = vec ($vector, 1, 4);6 : print ("high-to-low order values: $val1 and $val2/n");7 : $vector = pack ("b*", "");8 : $val1 = vec ($vector, 0, 4);9 : $val2 = vec ($vector, 1, 4);10: print ("low-to-high order values: $val1 and $val2/n");结果 high-to-low order values: 3 and 13low-to-high order values: 11 and 12
函数名 defined调用语法 retval = defined (expr);解说 判断一个变量、数组或数组的一个元素是否已经被赋值。expr为变量名、数组名或一个数组元素。如果已定义,返回真,否则返回假。
函数名 undef调用语法 retval = undef (expr);解说 取消变量、数组或数组元素甚至子程序的定义,回收其空间。返回值始终为未定义值,此值与空串等效。五、数组和列表函数
函数名 grep调用语法 @foundlist = grep (pattern, @searchlist);解说 与同名的UNIX查找工具类似,grep函数在列表中抽取与指定模式匹配的元素,参数pattern为欲查找的模式,返回值是匹配元素的列表。例子 @list = ("This", "is", "a", "test");@foundlist = grep(/^[tT]/, @list);结果 @foundlist = ("This", "test");
函数名 splice调用语法 @retval = splice (@array, slipelements, length, @newlist);解说&& 拼接函数可以向列表(数组)中间插入元素、删除子列表或替换子列表。参数skipelements是拼接前跳过的元素数目,length是被替换的元素数,newlist是将要拼接进来的列表。当newlist的长度大于length时,后面的元素自动后移,反之则向前缩进。因此,当length=0时,就相当于向列表中插入元素,而形如语句splice (@array, -1, 0, "Hello");则向数组末尾添加元素。而当newlist为空时就相当于删除子列表,这时,如果length为空,就从第skipelements个元素后全部删除,而删除最后一个元素则为:splice (@array, -1);这种情况下,返回值为被删去的元素列表。
函数名 shift调用语法 element = shift (@arrayvar);解说 删去数组第一个元素,剩下元素前移,返回被删去的元素。不加参数时,缺省地对@ARGV进行操作。
函数名 unshift调用语法 count = unshift (@arrayver, elements);解说 作用与shift相反,在数组arrayvar开头增加一个或多个元素,返回值为结果(列表)的长度。等价于splice (@array, 0, 0, elements);
函数名 push调用语法 push (@arrayvar, elements);解说 在数组末尾增加一个或多个元素。等价于slice (@array, @array, 0, elements);
函数名 pop调用语法 element = pop (@arrayvar);解说 与push作用相反,删去列表最后一个元素,并将其作为返回值,当列表已空,则返回“未定义值”(即空串)。
函数名 split调用语法 @list = split (pattern, string, maxlength);解说 将字符串分割成一组元素的列表。每匹配一次pattern,就开始一个新元素,但pattern本身不包含在元素中。maxlength是可选项,当指定它时,达到该长度就不再分割。
函数名 sort调用语法 @sorted = sort (@list);解说 按字母次序给列表排序。
函数名 reverse调用语法 @reversed = reverse (@list);解说 按字母反序给列表排序。
函数名 map调用语法 @resultlist = map (expr, @list);解说 此函数在Perl5中定义,可以把列表中的各个元素作为表达式expr的操作数进行运算,其本身不改变,结果作为返回值。在表达式expr中,系统变量$_代表各个元素。例子 1、@list = (100, 200, 300);&& @results = map ($_+1, @list);2、@results = map (&mysub($_), @list);结果 1、(101, 201, 301)2、无
函数名 wantarray调用语法 result = wantarray();解说 Perl中,一些内置函数的行为根据其处理简单变量还是数组有所不同,如chop。自定义的子程序也可以定义这样两种行为。当子程序被期望返回列表时,此函数返回值为非零值(真),否则为零值(假)。例子 1 : #!/usr/local/bin/perl2 :3 : @array = &mysub();4 : $scalar = &mysub();5 :6 : sub mysub {7 : if (wantarray()) {8 : print ("true/n");9 : } else {10: print ("false/n");11: }12: }结果 $programtruefalse$
六、关联数组函数
函数名 keys调用语法 @list = keys (%assoc_array);解说 返回关联数组无序的下标列表。
函数名 values调用语法 @list = values (%assoc_array);解说 返回关联数组无序的值列表。
函数名 each调用语法 @pair = each (%assoc_array);解说 返回两个元素的列表--键值对(即下标和相应的值),同样无序。当关联数组已空,则返回空列表。
函数名 delete调用语法 element = delete (assoc_array_item);解说 删除关联数组中的元素,并将其值作为返回值。例子 %array = ("foo", 26, "bar", 17");$retval = delete ($array{"foo"});结果 $retval = 26;
函数名 exists调用语法 result = exists (element);解说 在Perl5中定义,判断关联数组中是否存在某元素,若存在,返回非零值(真),否则返回零值(假)。例子 $result = exists ($myarray{$mykey});
七、文件相关函数open函数&&& open函数将文件变量与某文件联系起来,提供访问文件的接口,例如:open(MYVAR, "/u/file"); 如果文件打开成功,则返回非零值,否则返回零。缺省地,open打开文件用以读取其内容,若想打开文件以写入内容,则在文件名前加个大于号:open(MYVAR, "&/u/file"); 向已有的文件末尾添加内容用两个大于号:open(MYVAR, "&&/u/file"); 若想打开文件作为数据导向的命令,则在命令前加上管道符(|):open(MAIL, "|mail dave");用open重定向输入&&& 可以把打开的文件句柄用作向程序输入数据的命令,方法是在命令后加管道符(|),如:&&& open(CAT, "cat file*|");&&& 对open的调用运行命令cat file* ,此命令创建一个临时文件,这个文件的内容是所有以file打头的文件的内容连接而成,此文件看作输入文件,可用文件变量CAT访问,如:&&& $input = ;&&& 下面的例子使用命令w的输出来列出当前登录的所有用户名。
&&& 1 : #!/usr/local/bin/perl&&& 2 :&&& 3 : open (WOUT, "w|");&&& 4 : $time = &WOUT&;&&& 5 : $time =~ s/^ *//;&&& 6 : $time =~ s/ .*//;&&& 7 : ; # skip headings line&&& 8 : @users = ;&&& 9 : close (WOUT);&&& 10: foreach $user (@users) {&&& 11:&& $user =~ s/ .*//;&&& 12: }&&& 13: print ("Current time: $time");&&& 14: print ("Users logged on:/n");&&& 15: $prevuser = "";&&& 16: foreach $user (sort @users) {&&& 17:&& if ($user ne $prevuser) {&&& 18:&&&& print ("/t$user");&&& 19:&&&& $prevuser = $&&& 20:&& }&&& 21: }
&&& 结果输出如下:
&&& Current time: 4:25pm&&& Users logged on:&&&&& dave&&&&& kilroy&&&&& root&&&&& zarquon
&&& w命令列出当前时间、系统负载和登录的用户,以及每个用户的作业时间和当前运行的命令,如:
4:25pm up 1 day, 6:37, 6 users, load average: 0.79, 0.36, 0.28User&&&& tty&&&&&& login@ idle&& JCPU&& PCPU whatdave&&&& ttyp0&&&& 2:26pm&&&&&&&&&& 27&&&&& 3 wkilroy&& ttyp1&&&& 9:01am 2:27&& 1:04&&&& 11 -cshkilroy&& ttyp2&&&& 9:02am&&& 43&& 1:46&&&& 27 rnroot&&&& ttyp3&&&& 4:22pm&&&& 2&&&&&&&&&&&&&& -cshzarquon ttyp4&&&& 1:26pm&&&& 4&&&& 43&&&& 16 cc myprog.ckilroy&& ttyp5&&&& 9:03am&&&&&&&& 2:14&&&& 48 /usr/games/hack
&&& 上例中从w命令的输出中取出所需的信息:当前时间和登录的用户名。第3行运行w命令,此处对open的调用指定w的输出用作程序的输入,用文件变量WOUT来访问该输入。第4行读取第一行信息,即:&&& 4:25pm up 1 day, 6:37, 6 users, load average: 0.79, 0.36, 0.28&&& 接下来的两行从这行中抽取出时间。首先,第5行删除起始的空格,然后第6行删去除时间和结尾换行符之间的所有字符,存入变量$time。&&& 第7行从WOUT读取第二行,这行中无有用信息,故不作处理。第8行把剩下的行赋给数组@users,然后第9行关闭WOUT,终止运行w命令的进程。&&& @users中的每个元素都是一行用户信息,因为本程序只需要每行的第一个单词,即用户名,故10~12行去掉除换行符外的其它字符,这一循环结束后,@users中只剩下用户名的列表。&&& 第13行输出存贮在$time中的时间,注意这时print不需要加上换行符,因为$time中有。16~21行对@users中的用户名排序并输出。因为同一个用户可以多次登录,所以用$preuser存贮输出的最后一个用户名,下次输出数组元素$user时,如果其与$preser相等,则不输出。文件重定向&&& 许多UNIX shell可以把标准输出文件(STDOUT)和标准错误文件(STDERR)都重定向到同一个文件,例如在Bourne Shell(sh)中,命令&&& $ foo & file1 2&&1&&& 运行命令foo并把输出到标准输出文件和标准错误文件的内容存贮到文件file1中。下面是用Perl实现这一功能的例子:
&&& 1: #!/usr/local/bin/perl&&& 2:&&& 3: open (STDOUT, "&file1") || die ("open STDOUT failed");&&& 4: open (STDERR, "&&STDOUT") || die ("open STDERR failed");&&& 5: print STDOUT ("line 1/n");&&& 6: print STDERR ("line 2/n");&&& 7: close (STDOUT);&&& 8: close (STDERR);
&&& 运行后,文件file1中的内容为:&&&& line 2&&&& line 1&&& 可以看到,这两行并未按我们想象的顺序存贮,为什么呢?我们来分析一下这段程序。&&& 第3行重定向标准输出文件,方法是打开文件file1将它与文件变量STDOUT关联,这也关闭了标准输出文件。第4行重定向标准错误文件,参数&&STDOUT告诉Perl解释器使用已打开并与STDOUT关联的文件,即文件变量STDERR指向与STDOUT相同的文件。第5、6行分别向STDOUT和STDERR写入数据,因为这两个文件变量指向同一个文件,故两行字符串均写到文件file1中,但顺序却是错误的,怎么回事呢?&&& 问题在于UNIX对输出的处理上。当使用print(或其它函数)写入STDOUT等文件时,UNIX操作系统真正所做的是把数据拷贝到一片特殊的内存即缓冲区中,接下来的输出操作继续写入缓冲区直到写满,当缓冲区满了,就把全部数据实际输出。象这样先写入缓冲区再把整个缓冲区的内容输出比每次都实际输出所花费的时间要少得多,因为一般来说,I/O比内存操作慢得多。&&& 程序结束时,任何非空的缓冲区都被输出,然而,系统为STDOUT和STDERR分别维护一片缓冲区,并且先输出STDERR的内容,因此存贮在STDERR的缓冲区中的内容line 2出现在存贮在STDOUT的缓冲区中的内容line 1之前。&&& 为了解决这个问题,可以告诉Perl解释器不对文件使用缓冲,方法为:&&&& 1、用select函数选择文件&&&& 2、把值1赋给系统变量$|&&& 系统变量$|指定文件是否进行缓冲而不管其是否应该使用缓冲。如果$|为非零值则不使用缓冲。$|与系统变量$~和$^协同工作,当未调用select函数时,$|影响当前缺省文件。下例保证了输出的次序:
&&& 1 : #!/usr/local/bin/perl&&& 2 :&&& 3 : open (STDOUT, "&file1") || die ("open STDOUT failed");&&& 4 : open (STDERR, "&&STDOUT") || die ("open STDERR failed");&&& 5 : $| = 1;&&& 6 : select (STDERR);&&& 7 : $| = 1;&&& 8 : print STDOUT ("line 1/n");&&& 9 : print STDERR ("line 2/n");&&& 10: close (STDOUT);&&& 11: close (STDERR);
&&& 程序运行后,文件file1中内容为:&&&& line 1&&&& line 2&&& 第5行将$|赋成1,告诉Perl解释器当前缺省文件不进行缓冲,因为未调用select,当前的缺省文件为重定向到文件file1的STDOUT。第6行将当前缺省文件设为STDERR,第7行又设置$|为1,关掉了重定向到file1的标准错误文件的缓冲。由于STDOUT和STDERR的缓冲均被关掉,向其的输出立刻被写到文件中,因此line 1出现在第一行。指定读写权限&&& 打开一个既可读又可写的文件方法是在文件名前加上"+&",如下:&&&& open (READWRITE, "+&file1");&&& 此语句打开既可读又可写的文件file1,即可以重写其中的内容。文件读写操作最好与库函数seek和tell一起使用,这样可以跳到文件任何一点。&&& 注:也可用前缀"+&"指定可读写权限。close函数&&& 用于关闭打开的文件。当用close关闭管道,即重定向的命令时,程序等待重定向的命令结束,如:&&&& open (MYPIPE, "cat file*|");&&&& close (MYPIPE);&&& 当关闭此文件变量时,程序暂停运行,直到命令cat file*运行完毕。print, printf和write函数&&& print是这三个函数中最简单的,它向指定的文件输出,如果未指定,则输出到当前缺省文件中,如:&&&& print ("Hello, there!/n");&&&& print OUTFILE ("Hello, there!/n");&&& 第一句输出到当前缺省文件中,若未调用select,则为STDOUT。第二句输出到由文件变量OUTFILE指定的文件中。&&& printf函数先格式化字符串再输出到指定文件或当前缺省文件中,如:&&&& printf OUTFILE (“You owe me %8.2f", $owing);&&& 此语句取出变量$owing的值并替换掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮点数。&&& write函数使用输出格式把信息输出到文件中,如:&&&& select (OUTFILE);&&&& $~ = "MYFORMAT";&&&&&&& 关于printf和write,详见《第x章 格式化输出》。select函数&&& select函数将通过参数传递的文件变量指定为新的当前缺省文件,如:&&&& select (MYFILE);&&& 这样,MYFILE就成了当前缺省文件,当对print、write和printf的调用未指定文件时,就输出到MYFILE中。eof函数&&& eof函数查看最后一次读文件操作是否为文件最后一个记录,如果是,则返回非零值,如果文件还有内容,返回零。&&& 一般情况下,对eof的调用不加括号,因为eof和eof()是等效的,但与&&操作符一起使用时,eof和eof()就不同了。现在我们来创建两个文件,分别叫做file1和file2。file1的内容为:&&&& This is a line from the first file.&&&& Here is the last line of the first file.&&& file2的内容为:&&&& This is a line from the second and last file.&&&& Here is the last line of the last file.&&& 下面就来看一下eof和eof()的区别,第一个程序为:
&&& 1: #!/usr/local/bin/perl&&& 2:&&& 3: while ($line = &&) {&&& 4:&& print ($line);&&& 5:&& if (eof) {&&& 6:&&&& print ("-- end of current file --/n");&&& 7:&& }&&& 8: }
&&& 运行结果如下:
&&& $ program file1 file2&&& This is a line from the first file.&&& Here is the last line of the first file.&&& -- end of current file --&&& This is a line from the second and last file.&&& Here is the last line of the last file.&&& -- end of current file --&&& $
&&& 下面把eof改为eof(),第二个程序为:
&&& 1: #!/usr/local/bin/perl&&& 2:&&& 3: while ($line = &&) {&&& 4:&& print ($line);&&& 5:&& if (eof()) {&&& 6:&&&& print ("-- end of output --/n");&&& 7:&& }&&& 8: }
&&& 运行结果如下:
&&& $ program file1 file2&&& This is a line from the first file.&&& Here is the last line of the first file.&&& This is a line from the second and last file.&&& Here is the last line of the last file.&&& -- end of output --$
&&& 这时,只有所有文件都读过了,eof()才返回真,如果只是多个文件中前几个的末尾,返回值为假,因为还有要读取的输入。间接文件变量&&& 对于上述各函数open, close, print, printf, write, select和eof,都可以用简单变量来代替文件变量,这时,简单变量中所存贮的字符串就被看作文件变量名,下面就是这样一个例子,此例很简单,就不解释了。需要指出的是,函数open, close, write, select和eof还允许用表达式来替代文件变量,表达式的值必须是字符串,被用作文件变量名。
&&& 1: #!/usr/local/bin/perl&&& 2:&&& 3: &open_file("INFILE", "", "file1");&&& 4: &open_file("OUTFILE", "&", "file2");&&& 5: while ($line = &read_from_file("INFILE")) {&&& 6:&& &print_to_file("OUTFILE", $line);&&& 7: }&&& 8:&&& 9: sub open_file {&&& 10:&& local ($filevar, $filemode, $filename) = @_;&&& 11:&&& 12:&& open ($filevar, $filemode . $filename) ||&&& 13:&&&& die ("Can't open $filename");&&& 14: }&&& 15: sub read_from_file {&&& 16:&& local ($filevar) = @_;&&& 17:&&& 18:&& &$filevar&;&&& 19: }&&& 20: sub print_to_file {&&& 21:&& local ($filevar, $line) = @_;&&& 22:&&& 23:&& print $filevar ($line);&&& 24: }
2、跳过和重读数据
函数名 seek调用语法 seek (filevar, distance, relative_to);解说 在文件中向前/后移动,有三个参数:1、filevar,文件变量2、distance,移动的字节数,正数向前移动,负数往回移动3、reletive_to,值可为0、1或2。为0时,从文件头开始移动,为1时,相对于当前位置(将要读的下一行)移动,为2时,相对于文件末尾移动。运行成功返回真(非零值),失败则返回零,常与tell函数合用。
函数名 tell调用语法 tell (filevar);解说 返回从文件头到当前位置的距离。注意:1、seek和tell不能用于指向管道的文件变量。2、seek和tell中文件变量参数可使用表达式。3、系统读写函数
函数名 read调用语法 read (filevar, result, length, skipval);解说 read函数设计得与UNIX的fread函数等效,可以读取任意长度的字符(字节)存入一个简单变量。其参数有四个:1、filevar:文件变量2、result:存贮结果的简单变量(或数组元素)3、length:读取的字节数4、skipval:可选项,指定读文件之前跳过的字节数。返回值为实际读取的字节数,如果已到了文件末尾,则返回零,如果出错,则返回空串。
函数名 sysread调用语法 sysread (filevar, result, length, skipval);解说 更快的读取数据,与UNIX函数read等效,参数与read相同。
函数名 syswrite调用语法 syswrite (filevar, data, length, skipval);解说 更快的写入数据,与UNIX函数write等效,参数:1、filevar:将要写入的文件2、data:存贮要写入数据的变量3、length:要写入的字节数4、skipval写操作之前跳过的字节数。4、用getc读取字符
函数名 getc调用语法 $char = getc (infile);解说 从文件中读取单个字符。5、用binmode读取二进制文件
函数名 binmode调用语法 binmode (filevar);解说 当你的系统(如类DOS系统)对文本文件和二进制文件有所区别时使用。必须在打开文件后、读取文件前使用。
八、目录相关函数
函数名 mkdir调用语法 mkdir (dirname, permissions);解说 创建新目录,参数为:1、dirname:将要创建的目录名,可以为字符串或表达式2、permissions:8进制数,指定目录的访问权限,其值和意义见下表,权限的组合方法为将相应的值相加。
值 权限4000&& 运行时设置用户ID 2000 运行时设置组ID1000 粘贴位0400 拥有者读权限0200 拥有者写权限0100 拥有者执行权限0040 组读权限0020 组写权限0010 组执行权限0004 所有人读权限0002 所有人写权限0001 所有人执行权限
函数名 chdir调用语法 chdir (dirname);解说 改变当前工作目录。参数dirname可以为字符串,也可以为表达式。
函数名 opendir调用语法 opendir (dirvar, dirname);解说 打开目录,与下面几个函数合用,可查看某目录中文件列表。参数为:1、dirvar:目录变量,与文件变量类似2、dirname:目录名,可为字符串或表达式成功返回真值,失败返回假。注:程序中可用同名的目录变量和文件变量,根据环境确定取成分。
函数名 closedir调用语法 closedir (mydir);解说 关闭打开的目录。
函数名 readdir调用语法 readdir (mydir);解说 赋给简单变量时,每次赋予一个文件或子目录名,对数组则赋予全部文件和子目录名。
函数名 telldir调用语法 location = telldir (mydir);解说 象在文件中前后移动一样,telldir和下面的seekdir用于在目录列表中前后移动。
函数名 seekdir调用语法 seekdir(mydir, location);解说 location必须为telldir返回的值。
函数名 rewinddir调用语法 rewinddir (mydir);解说 将读取目录的位置重置回开头,从而可以重读目录列表。
函数名 rmdir调用语法 rmdir (dirname);解说 删除空目录。成功则返回真(非零值),失败返回假(零值)。
九、文件属性函数1、文件重定位函数
函数名 rename调用语法 rename (oldname, newname);解说 改变文件名或移动到另一个目录中,参数可为字符串或表达式。
函数名 unlink调用语法 num = unlink (filelist);解说 删除文件。参数为文件名列表,返回值为实际删除的文件数目。此函数之所以叫unlink而不叫delete是因为它实际所做的是删除文件的链接。2、链接和符号链接函数
函数名 link调用语法 link (newlink, file);解说 创建现有文件的链接--硬链接,file是被链接的文件,newlink是被创建的链接。成功返回真,失败返回假。当删除这两个链接中的一个时,还可以用另一个来访问该文件。
函数名 symlink调用语法 symlink (newlink, file);解说 创建现有文件的符号链接,即指向文件名,而不是指向文件本身。参数和返回值同上。当原文件被删除(如:被unlinke函数删除),则被创建链接不可用,除非再创建一个与原被链接的文件同名的文件。
函数名 readlink调用语法 filename = readlink (linkname);解说 如果linkname为符号链接文件,返回其实际指向的文件。否则返回空串。3、文件许可权函数
函数名 chmod调用语法 chmod (permissions, filelist);解说 改变文件的访问权限。参数为:1、permissions为将要设置的权限,其含义见上述mkdir中权限表2、filelist为欲改变权限的文件列表
函数名 chown调用语法 chown (userid, groupid, filelist);解说 改变文件的属主,有三个参数:1、userid:新属主的(数字)ID号2、groupid:新的组(数字)ID号,-1为保留原组3、filelist:欲改变属主的文件列表
函数名 umask调用语法 oldmaskval = umask (maskval);解说 设置文件访问权限掩码,返回值为当前掩码。4、其它属性函数
函数名 truncate调用语法 truncate (filename, length);解说 将文件的长度减少到length字节。如果文件长度已经小于length,则不做任何事。其中filename可以为文件名,也可以为文件变量
函数名 stat调用语法 stat (file);解说 获取文件状态。参数file可为文件名也可为文件变量。返回列表元素依次为:# 文件所在设备# 内部参考号(inode)# 访问权限# 硬链接数# 属主的(数字)ID# 所属组的(数字)ID# 设备类型(如果file是设备的话)# 文件大小(字节数)# 最后访问时间# 最后修改时间# 最后改变状态时间I/O操作最佳块大小# 分配给该文件的块数
函数名 lstat调用语法 lstat (file);解说 与stat类似,区别是将file看作是符号链接。
函数名 time调用语法 currtime = time();解说 返回从日起累计秒数。
函数名 gmtime调用语法 timelist = gmtime (timeval);解说 将由time, stat 或 -A 和 -M 文件测试操作符返回的时间转换成格林威治时间。返回列表元素依次为:# 秒# 分钟# 小时,0~23# 日期# 月份,0~11(一月~十二月)# 年份# 星期,0~6(周日~周六)# 一年中的日期,0~364# 是否夏令时的标志
详见UNIX的gmtime帮助。
函数名 localtime调用语法 timelist = localtime (timeval);解说 与gmtime类似,区别为将时间值转换为本地时间。
函数名 utime调用语法 utime (acctime, modtime, filelist);解说 改变文件的最后访问时间和最后更改时间。例如:$acctime = -A "file1";$modtime = -M "file1";@filelist = ("file2", "file3");utime ($acctime, $modtime, @filelist);
函数名 fileno调用语法 filedesc = fileno (filevar);解说 返回文件的内部UNIX文件描述。参数filevar为文件变量。
函数名 fcntlflock调用语法 fcntl (filevar, fcntlrtn, value);flock (filevar, flockop);解说 详见同名UNIX函数帮助。&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:32396次
排名:千里之外
原创:35篇
(1)(1)(4)(2)(1)(1)(1)(4)(3)(2)(1)(1)(1)(2)(2)(1)(3)(4)(3)

我要回帖

更多关于 perl 函数调用 的文章

 

随机推荐