Perl Learning 3 Subroutine
【本文原创,转载请说明】
赶在期末了,后天就是第一门。。这两天学的是子函数的用法。
要定义你自己的子程序,可使用关键字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相关推荐
- Perl Learning (5) —— 输入与输出
(1) 读取标准输入 (2) 钻石操作符输入 (3) 调用参数 (4) 输出到标准输出 (5) 使用printf格式化输出 (6) 数组和printf (7) 文件句柄 (8) 打开和关闭文件句柄 ( ...
- Perl/CGI脚本语言编程学习资料及开发工具下载大全
Practical Extraction and Report Language Perl 最初的设计者为拉里·沃尔(Larry Wall),它于1987年12月18日发表.Perl借取了C.sed. ...
- python思想读后感_《Deep Learning with Python》读后感精选
<Deep Learning with Python>是一本由Francois Chollet著作,Manning Publications出版的Paperback图书,本书定价:USD ...
- MRTG教程(五):MRTG的配置参考指南
mrtg的配置参考指南 内容 NAME OVERVIEW SYNTAX GLOBAL KEYWORDS OPTIONAL GLOBAL KEYWORDS EXAMPLES NAME mrtg-refe ...
- Learning Perl 2
1.子程序 1).创建子程序:使用关键字sub sub marine { print "Hello, world\n"; } calling subroutines,使用& ...
- Learning Perl学习笔记(1)第二章Scalar Data
If Control Structure(IF循环) 脚本如下: #!/usr/bin/perl use warnings; use strict; use v5.24; my $line = < ...
- Learning Perl(Perl语言入门)学习笔记(3)
第四章 子例程 1. 子例程(subroutine)即用户自定义函数,子例程调用时通常在子例程名前加上"&"符号:子例程名属于独立的命名空间: 2. 子例程可以在程 ...
- 执行perl时出现Undefined subroutine
对perl研究得不是很深,平时只是随便写写,最近一次,执行perl时,出现如下错误 Undefined subroutine &main::like called at ./get.t lin ...
- 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 ...
最新文章
- slack 国内 android,使用Slack Api登录,Android
- 2019-10-12 欧拉公式的理解
- 【Python】Jupyter Notebook的十大隐藏技巧--如何大大加速算法的迭代
- 监狱中的物联网用例:从尘土飞扬的监狱到智能监狱设施
- 成员的访问控制java_java类成员的访问控制(翻译自Java Tutorials)
- P5631-最小mex生成树【线段树,并查集】
- javascript - dom
- 开启和关闭wifi的代码段
- 高通modem启动过程_苹果首次承认正自研基带芯片,高通要被抛弃了?
- vim配置python开发环境_GitHub - TTWShell/legolas-vim: Vim配置,为python、go开发者打造的IDE。...
- Animator 设置动画效果
- 第一次使用水晶报表,柱状图的横竖坐标不会定位,怎么办?
- python函数可以改变哪种数据类型的实参_表达式1+2*3.140的结果类型是():_学小易找答案...
- Atitit 索引技术--位图索引
- 像素、英寸、厘米的换算
- MySQL 查询优化如何坐到极致?
- Vue框架的初识入门
- 本周大新闻|传微软解散工业元宇宙团队,MIT研发垂直堆叠全彩Micro LED
- 小米Pro 15.6 系统重装记录
- 硬盘引导恢复(mbr主引导记录的恢复)