【本文原创,转载请说明】

赶在期末了,后天就是第一门。。这两天学的是子函数的用法。

要定义你自己的子程序,可使用关键字sub、子程序名(不包含与号)以及用花括号封闭起来的代码块,这部分代码就是子程序的主体。

在任意表达式中使用子程序名(前面加上与号)来调用它:&hsl

任何Perl子程序都有返回值,那么规定每次必须写“return”某值就显得非常费事,我们可以将其简化。在子程序的执行过程中,它会不断进行运算,而最后一次运算结果(不管是什么)都会被自动当成子程序的返回值。子程序中的变量是全局变量。

Perl子程序可以有参数(argument),要传递参数列表到子程序里,只要在子程序调用的后面加上被括号圈引的列表表达式就行了。例如:

参数列表将会被传入子程序,让子程序随意使用。当然,得先将这个列表存在某处,Perl会自动将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效。子程序可以访问这个数组,以判断参数的个数以及参数的值。这表示子程序的第一个参数存储于$_[0],第二个参数存储于$_[1]...

实际上,@_变量是子程序的私有变量。假如已经有了全局变量@_,则该变量在子程序调用前会先被存起来,并在子程序返回时恢复原本的值。

我们可以借助my操作符来创建私有变量,称之为词法变量(lexical variable)

这些变量属于封闭语句块的私有变量(或者也可以称作有限作用域(scoped)变量),语句块之外任何地方的$m或$n都完全不受这两个私有变量的影响。

将上面两行合并:

在真实的Perl代码中,常常会把更长的列表作为参数传递给子程序。但我们需要写一些代码来检查列表参数的个数。

改进后的max函数:

以上这段代码使用了一般会称为“高水线(high-watermark)”的算法:大水过后,在最后一波浪消退时,高水线会标示出所见过的最高水位。

My操作符并不会更改变量赋值时的上下文:

在my操作符不加括号时,只能用来声明单词词法变量。在我们平常Perl编程当中,我们最好对每个变量都使用my声明,让它保持在自己所在的词法作用域内。

Use strict编译指令是要告诉Perl内部的编译器接下来的代码应该稍加严谨一点。

如果想在子程序执行到一半时停止执行,用return,它会立即停止执行并从子程序内返回某个值。而且不再执行子程序的其余部分。

会返回3,因为3是dino的下标。

将子程序定义放在调用之前,可以不同添加&进行引用。但如果该子程序额Perl内置函数同名,我们就必须使用&去调用。

子程序不仅可以返回标量值,如果我们在列表上下文调用它,它还能返回列表值。

结果为11,10,9,8,7,6

在子程序中可以使用my操作符来创建私有变量,但每次调用这个子程序的时候,这个私有变量都会被重新定义。而使用state操作符来声明变量,我们便可以在子程序的多次调用期间保留变量之前的值,并将变量的作用域局限于子程序内部。

这段代码是正确的,但不幸的是我没有编译成功:

因为要用state,得加上use feature ‘state’,但是还是不过,因为linux服务器上的perl是5.8.8的,而state是5.10才出来的,所以我就没有更新了。

课后习题:

第一题:

第二题:

直接调用得到结果:

第三题:

第四题:

结果行不通。

我用我电脑中的虚拟机跑,在答案的帮助下,进一步的了解了state的用法。

答案给出的第一题:

简直太精简了,这个子程序使用$sum来存储到目前为止的总和。每次子程序开始执行时,$sum都会是新创建的变量,因此其值为undef。之后,foreach循环会以$_作为控制变量来逐项处理@_里的参数

第三题:

在average里面,如果参数列表是空的,子程序就会结束,返回undef,表示没有平均值。正因为此,在above_average中的循环控制变量为$element,而不是Perl最爱的默认变量$_。

随着Perl编程的不断深入,我发现很多方法真的不是靠想就能想出来的,一定要多去编。

Perl Learning 3 Subroutine相关推荐

  1. Perl Learning (5) —— 输入与输出

    (1) 读取标准输入 (2) 钻石操作符输入 (3) 调用参数 (4) 输出到标准输出 (5) 使用printf格式化输出 (6) 数组和printf (7) 文件句柄 (8) 打开和关闭文件句柄 ( ...

  2. Perl/CGI脚本语言编程学习资料及开发工具下载大全

    Practical Extraction and Report Language Perl 最初的设计者为拉里·沃尔(Larry Wall),它于1987年12月18日发表.Perl借取了C.sed. ...

  3. python思想读后感_《Deep Learning with Python》读后感精选

    <Deep Learning with Python>是一本由Francois Chollet著作,Manning Publications出版的Paperback图书,本书定价:USD ...

  4. MRTG教程(五):MRTG的配置参考指南

    mrtg的配置参考指南 内容 NAME OVERVIEW SYNTAX GLOBAL KEYWORDS OPTIONAL GLOBAL KEYWORDS EXAMPLES NAME mrtg-refe ...

  5. Learning Perl 2

    1.子程序 1).创建子程序:使用关键字sub sub marine { print "Hello, world\n"; } calling subroutines,使用& ...

  6. Learning Perl学习笔记(1)第二章Scalar Data

    If Control Structure(IF循环) 脚本如下: #!/usr/bin/perl use warnings; use strict; use v5.24; my $line = < ...

  7. Learning Perl(Perl语言入门)学习笔记(3)

    第四章 子例程   1.  子例程(subroutine)即用户自定义函数,子例程调用时通常在子例程名前加上"&"符号:子例程名属于独立的命名空间: 2.  子例程可以在程 ...

  8. 执行perl时出现Undefined subroutine

    对perl研究得不是很深,平时只是随便写写,最近一次,执行perl时,出现如下错误 Undefined subroutine &main::like called at ./get.t lin ...

  9. Jsp java subroutine_Perl错误:无法修改非左值子例程调用(Perl error: Can't modify non-lvalue subroutine call at)...

    Perl错误:无法修改非左值子例程调用(Perl error: Can't modify non-lvalue subroutine call at) 我的班级出现以下错误:"无法在file ...

最新文章

  1. slack 国内 android,使用Slack Api登录,Android
  2. 2019-10-12 欧拉公式的理解
  3. 【Python】Jupyter Notebook的十大隐藏技巧--如何大大加速算法的迭代
  4. 监狱中的物联网用例:从尘土飞扬的监狱到智能监狱设施
  5. 成员的访问控制java_java类成员的访问控制(翻译自Java Tutorials)
  6. P5631-最小mex生成树【线段树,并查集】
  7. javascript - dom
  8. 开启和关闭wifi的代码段
  9. 高通modem启动过程_苹果首次承认正自研基带芯片,高通要被抛弃了?
  10. vim配置python开发环境_GitHub - TTWShell/legolas-vim: Vim配置,为python、go开发者打造的IDE。...
  11. Animator 设置动画效果
  12. 第一次使用水晶报表,柱状图的横竖坐标不会定位,怎么办?
  13. python函数可以改变哪种数据类型的实参_表达式1+2*3.140的结果类型是():_学小易找答案...
  14. Atitit 索引技术--位图索引
  15. 像素、英寸、厘米的换算
  16. MySQL 查询优化如何坐到极致?
  17. Vue框架的初识入门
  18. 本周大新闻|传微软解散工业元宇宙团队,MIT研发垂直堆叠全彩Micro LED
  19. 小米Pro 15.6 系统重装记录
  20. 硬盘引导恢复(mbr主引导记录的恢复)

热门文章

  1. 平台交叉打包 GYP
  2. 测试工程师如何跟进用户反馈
  3. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器。
  4. NLP/常用数据集简介
  5. App Store评论优化,让你的APP评论上涨
  6. nginx本地代理调试微信登录(window版本)
  7. Jeecg-Boot前端部署
  8. 开课通知 | 2021FPGA寒假班/就业班开课啦!
  9. PCB板设计布局原则有哪些?
  10. Python-OpenCV-PS油画滤镜效果