第八章 子程序

by flamephoenix

一、定义
二、调用
  1、用&调用
  2、先定义后调用
  3、前向引用
  4、用do调用
三、返回值
四、局部变量
五、子程序参数传递
  1、形式
  2、传送数组
六、递归子程序
七、用别名传递数组参数
八、预定义的子程序

一、定义 
  子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读。PERL中,子程序可以出现在程序的任何地方。定义方法为:
  sub subroutine{
    statements;
  }
二、调用 
  调用方法如下:
1、用&调用 
  &subname;
  ...
  sub subname{
    ...
  }
2、先定义后调用 ,可以省略&符号
  sub subname{
    ...
  }
  ...
  subname;
3、前向引用 ,先定义子程序名,后面再定义子程序体
  sub subname;
  ...
  subname;
  ...
  sub subname{
    ...
  }
4、用do调用 
  do my_sub(1, 2, 3);等价于&my_sub(1, 2, 3);
三、返回值 
  缺省的,子程序中最后一个语句的值将用作返回值。语句return (retval);也可以推出子程序并返回值retval,retval可以为列表。
四、局部变量 
  子程序中局部变量的定义有两种方法:my和local。其区别是:my定义的变量只在该子程序中存在;而local定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中(在PERL4中没有my)。定义时可以给其赋值,如:
  my($scalar) = 43;
  local(@array) = (1, 2, 3);
五、子程序参数传递 
1、形式 
  &sub1(&number1, $number2, $nubmer3);
  ...
  sub sub1{
    my($number1, $number2, $number3) = @_;
    ...
  }
2、传送数组 
  &addlist (@mylist);
  &addlist ("14", "6", "11");
  &addlist ($value1, @sublist, $value2);
  ...
  sub addlist {
    my (@list) = @_;
    ...
  }
参数为数组时,子程序只将它赋给一个数组变量。如
  sub twolists {
    my (@list1, @list2) = @_;
  }
中@list2必然为空。但简单变量和数组变量可以同时传递:
  &twoargs(47, @mylist); # 47赋给$scalar,@mylist赋给@list
  &twoargs(@mylist); # @mylist的第一个元素赋给$scalar,其余的元素赋给@list
  ...
  sub twoargs {
    my ($scalar, @list) = @_;
    ...
  }
六、递归子程序 
  PERL中,子程序可以互相调用,其调用方法与上述相同,当调用该子程序本身时,即成了递归子程序。递归子程序有两个条件:1、除了不被子程序改变的变量外,所有的变量必须的局部的;2、该子程序要含有停止调用本身的代码。
七、用别名传递数组参数 
1、用前面讲到的调用方法&my_sub(@array)将把数组@array的数据拷贝到子程序中的变量@_中,当数组很大时,将会花费较多的资源和时间,而用别名传递将不做这些工作,而对该数组直接操作。形式如:
  @myarray = (1, 2, 3, 4, 5);
  &my_sub(*myarray);
  sub my_sub {
    my (*subarray) = @_;
  }
2、此方法类似于C语言中的传递数组的起始地址指针,但并不一样,在定义数组的别名之后,如果有同名的简单变量,则对该变量也是起作用的。如:
  $foo = 26;
  @foo = ("here's", "a", "list");
  &testsub (*foo);
  ...
  sub testsub {
    local (*printarray) = @_;
    ...
    $printarray = 61;
  }
  当子程序执行完,主程序中的$foo的值已经成了61,而不再是26了。
3、用别名的方法可以传递多个数组,如:
  @array1 = (1, 2, 3);
  @array2 = (4, 5, 6);
  &two_array_sub (*array1, *array2);
  sub two_array_sub {
    my (*subarray1, *subarray2) = @_;
  } 
  在该子程序中,subarray1是array1的别名,subarray2是array2的别名。
八、预定义的子程序 
  PERL5预定义了三个子程序,分别在特定的时间执行,它们是:BEGIN子程序在程序启动时被调用;END子程序在程序结束时被调用;AUTOLOAD子程序在找不到某个子程序时被调用。你可以自己定义它们,以在特定时间执行所需要的动作。如:
  BEGIN {
    print("Hi! Welcome to Perl!\n");
  }
  AUTOLOAD{
    print("subroutine $AUTOLOAD not found\n"); # 变量$AUTOLOAD即未找到的子程序名
    print("arguments passed: @_\n");
  }
  若同一个预定义子程序定义了多个,则BEGIN顺序执行,END逆序执行。

上一章 下一章 目录

perl5 第八章 子程序的更多相关文章

  1. perl 第十四章 Perl5的包和模块

    第十四章 Perl5的包和模块 by flamephoenix 一.require函数  1.require函数和子程序库  2.用require指定Perl版本二.包  1.包的定义  2.在包间切 ...

  2. perl5 附录一 函数集(未定稿)

    附录一 函数集(未定稿) by flamephoenix 一.进程处理函数  1.进程启动函数  2.进程终止函数  3.进程控制函数  4.其它控制函数二.数学函数三.字符串处理函数四.标量转换函数 ...

  3. perl5 第十三章 Perl的面向对象编程

    第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...

  4. perl5 第十二章 Perl5中的引用/指针

    第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句 ...

  5. perl5 第九章 关联数组/哈希表

    第九章 关联数组/哈希表 by flamephoenix 一.数组变量的限制二.定义三.访问关联数组的元素四.增加元素五.创建关联数组六.从数组变量复制到关联数组七.元素的增删八.列出数组的索引和值九 ...

  6. CSAPP:第八章 异常控制流1

    CSAPP:第八章 异常控制流1 关键点:异常 8.1 异常8.2 进程   现代系统通过使控制流发生突变来对这些情况做出反应,一般而言,我们把这些突变称为异常控制流(Exceptional Cont ...

  7. perl学习之子程序

    一.定义子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:sub subroutine{statements;}二.调 ...

  8. csapp:第八章 异常控制流ECF

    第八章 异常控制流ECF 8.1 异常 Exception graph LR E[异常Exception]-->E2[中断:异步异常] E-->E3[同步异常] E3-->陷阱 E3 ...

  9. 深入理解计算机系统 第八章 异常控制流 part1

    本章主旨 第八章的目的是阐述清楚应用程序是如何与操作系统交互的(之前章节的学习是阐述应用程序是如何与硬件交互的) 异常控制流 异常控制流,即 ECF(exceptional contril flow) ...

随机推荐

  1. 通过git和Xcode将代码上传到GitHub

    长话短说: 第一步:初始化一个本地仓库 git init 第二步:将你的文件添加到缓存区 git add . 后面的空格 . 是将全部的文件都添加到缓存区  可以使用git status  查看状态 ...

  2. 用css控制一个DIV画图标。

    在实际开发中,我们会用到一些小图形,图标.大多数情况下都是用图片来实现的,同时对图片进行处理使图片大小尽可能的缩小.但是图片在怎么处理也是按KB来算的.但是要是用CSS画,只要用很少的空间就能完成同样 ...

  3. HDU 4498 Function Curve (分段, simpson)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 最近太逗了...感觉成都要打铁了...只能给队友端 ...

  4. spring util命名空间

    在spring的配置文件中util命名空间类似于java.util包类对应,util命名空间提供了集合相关的配置,在使用命名空间前要导入util命名空间,如下: util命名空间引入 <bean ...

  5. java selenium webdriver实战 helloWord

    第一步:建立Maven项目 Selenium 支持 maven 工程,这会让你的工作更加简便. 用 Eclipse 建个 Maven 的工程,建成后,修改 pom.xml <dependenci ...

  6. Windows Azure 新上线网络相关服务

     动态路由网关.点到站点(Point to Site)VPN正式商用 动态路由网关和点到站点VPN支持基于路由的VPN,并且允许用户将独立计算机连接到Azure上的虚拟网络.现在,虚拟网络中的动态 ...

  7. Home | eMine: Web Page Transcoding Based on Eye Tracking Project Page

    Home | eMine: Web Page Transcoding Based on Eye Tracking Project Page The World Wide Web (web) has m ...

  8. InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)

    WEB站点在调用我们WCF服务的时候,只要传入的参数过长,就报如下错误: 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: formD ...

  9. xcode 工具栏中放大镜的替换的说明

    1.如果是在打开的文档范围内:       查找: Command+ F       替换: Option+Command+F                   Replace All   是全部替 ...

  10. iOS面试题02-数据存储

    1.如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢? 回答:编写SQL语句来操作原来表中的字段 1>增加表字段 ALETER TABLE 表名 ADD COLUMN 字段名 ...