Perl Learning (4) —— 子程序

原创 2011年01月25日 14:46:00

2011-01-25 wcdj

 

(1) 定义子程序和调用子程序
(2) 返回值
(3) 参数
(4) 子程序中的私有变量
(5) 长度可变的参数列表
(6) 关于词法(my)变量
(7) use strict编译命令
(8)  return操作符
(9) 省略“&”与号
(10) 非标量返回值 —— 返回列表值
(11) 持久性私有变量 —— 作用类似C中的static关键字

Perl也可以创建子程序(subroutines),也就是用户定义的函数。—— 让我们可以重复利用已有的代码。

(1) 定义子程序和调用子程序
使用关键字sub,子程序名(不包含“与号”)以及经过缩进的代码块(花括号中的内容),它们组成了子程序的主体。
注意:
[1] 子程序可以在程序的任意位置定义。
[2] 任何情况下你都不需要对子程序进行事先声明。
例如:

[3] 子程序的定义是全局的;除非你使用一些强有力的技巧,否则不存在所谓的私有子程序。
[4] 假如定义了两个重名的子程序,那么后面的那个子程序会覆盖掉前面的。(重名这种做法很不好!)


(2) 返回值
在Perl中,所有的子程序都有一个返回值——子程序并没有“有返回值”和“没有返回值”之分。但并不是所有的Perl子程序都包含有用的返回值。
注意:
在子程序中,最后一次运算的结果(不管是什么)——即,最后执行的表达式,而非程序代码的最后一行,都会被自动当成子程序的返回值。
例如:

 

(3) 参数
Perl子程序可以有参数(argument)。要传递参数列表(argument list)到子程序里,只要在子程序调用的后面加上被括号圈引的列表表达式(list expression)就行了。
Perl会自动将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效。子程序可以访问这个数组,以判断参数的个数以及参数的值。
这表示,子程序的第一个参数存储于$_[0],第二个参数存储于$_[1],依次类推。但是,请特别注意,这些变量和$_变量毫无关联。
参数列表总得存进某个数组变量里,好让子程序使用,而Perl将这个数组叫做@_,仅此而已。

(4) 子程序中的私有变量
默认情况下,Perl中所有的变量都是全局变量。
我们可以用my操作符来随时创建一个私有的词法变量(lexical variables)。
例如:

注意:
Perl允许省略语句块中最后一个分号,但实际上,通常只有在程序代码简单到整个语句块只有一行时,才有必要省略分号。

 

(5) 长度可变的参数列表
在真实的Perl代码中,常常把更长的(任意长度的)列表作为参数传递给子程序。
子程序可以很容易地通过检查@_数组的长度来确定参数的个数是否正确。

在追求实用的Perl程序中,这种检查方式很少见,比较好的做法是让子程序能够适应任意数目的参数。
【更好的&max子程序 —— “高水线”的算法】

 

(6) 关于词法(my)变量
注意:
[1] 词法变量的作用域受限于(引入它的)最内层语句块(或文件)。
[2] my操作符并不会更改变量赋值时的上下文。
my($num)=@_;# 列表上下文,和($num)=@_;相同,$num会被设为第一个参数
my $num=@_;# 标量上下文,和$num=@_;相同,$num会被设为参数的个数
[3] 记住:在my不使用括号时,只用来声明单个词法变量。
my $a, $b; # 错,没声明$b
my($a, $b);# 两个都声明了

(7) use strict编译命令
Perl通常是个相当宽容的语言。但是,也许你会想要Perl更严格一些,这时可以使用use strict编译命令。
建议:比整个屏幕长的程序都应该加上use strict。

(8)  return操作符
return操作符会从子程序中立即返回某个值。
习惯:只有返回发生在子程序的最后一行代码之前的时候,才需要使用return,否则可以省略return。
例如:

 

(9) 省略“&”与号
真正的省略规则:
除非你知道Perl所有的内置函数名,否则请务必在调用函数时使用“&”与号。

(10) 非标量返回值 —— 返回列表值
子程序不仅可以返回标量值,如果你在列表上下文中调用它,它就能返回列表值。

(11) 持久性私有变量 —— 作用类似C中的static关键字
在子程序中可以使用my操作符来创建私有变量,但每次调用这个子程序的时候,这个私有变量都会被重新定义。使用state操作符来声明变量,我们便可以在子程序的多次调用间保留变量的值,并将变量的作用域局限于子程序中。
例如:

 

输出:
The sum of (5 6) is 11
The sum of (5 6 1 2 3) is 17
The sum of (5 6 1 2 3 4) is 21
注意:
在Perl 5.10中,我们不能在列表上下文中初始化数组和哈希这两种类型的state变量。也许在以后的版本中可以。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

perl学习(4) 子程序

子程序,类比c语言中的函数,在形式上个人认为最大的区别:没有形参 1.1.定义子程序 1.2.调用 #! /usr/bin/perl   sub marine {     $n += 1 ;...

Perl Learning 4 Input & Output

【本文原创,未经允许不许转载】 读取标准输入流我们之前已经用过行输入操作符。在标量上下文中执行该操作时,将会返回标准输入中的下一行。如果读到文件结尾,行输入操作符就会返回undef。这样的设计是为了...
  • manhusl
  • manhusl
  • 2015年07月05日 10:11
  • 411

Learning Perl(4th edition)笔记<东南大学影印版>

P16,17 Perl将所有数都当作double类型处理。
  • ZF180
  • ZF180
  • 2014年09月26日 09:25
  • 1444

Learning Perl ( 中文第五版)——part_1

  • 2010年08月26日 18:51
  • 16.55MB
  • 下载

Perl Learning (2) —— 标量数据

一般来说,Perl用标量(scalar)来称呼单件事物。标量是Perl里面最简单的一种数据类型。...

Perl Learning (3_1) —— 列表与数组

如果说Perl的标量代表的是单数(singular),那么在Perl里代表复数(plural)的就是列表和数组。...

Perl Learning (7_2) —— 漫游正则表达式王国

(1) 模式分组 (2) 择一匹配 (3) 字符集 (4) 字符集简写 (5) 反义简写

Perl Learning (7_1) —— 漫游正则表达式王国

(1) 什么是正则表达式? (2) 使用简易模式 (3) 关于元字符 (4) 简易量词

Perl Learning (6) —— 哈希

数组和哈希的区别:相同点:可以容纳很多值(没有上限),并能随机存取。不同点:不像数组是以数字(下标)来检索,哈希是以名字(唯一的字符串)来检索。...

Learning.Perl.4th.中文版

  • 2010年11月25日 17:18
  • 2.63MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Perl Learning (4) —— 子程序
举报原因:
原因补充:

(最多只允许输入30个字)