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 子程序传递参数

v-lhb-db01:/root/sbin# cat s1.pl use Net::SMTP; use HTTP::Date qw(time2iso str2time time2iso time2i...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2015年05月11日 16:56
  • 952

Perl子程序参数是数组或哈希表时的问题

 Perl子程序参数是数组或哈希表时,函数中获得这些参数值的方式和一般的标量变量是不同的。Perl代码#!/usr/bin/perl   use strict;   use warnings;    ...
  • aldenphy
  • aldenphy
  • 2009年11月15日 10:03
  • 1953

PERL子程序的调用与return操作符

先不说别的,先上代码 use strict; sub which_element_is() { my ($what,@array)=@_; foreach(0..$#array) { if($what...
  • dasgk
  • dasgk
  • 2013年10月19日 10:12
  • 2486

perl 子程序传递参数不同类型变量 设置

#!/bin/perl$str_my1=_old1;$str_my2=_old2;&sub_test(*str_my1,*str_my2);sub sub_test{ ($str_my1,$str_m...
  • zkh8wlsf
  • zkh8wlsf
  • 2006年01月18日 10:43
  • 1456

PERL语言入门:第四章:子程序(函数) :调用子程序与子程序返回值

调用子函数, 这样: &SUMDATA; 或 &SUMDATA($a, $b); 当然, 有些情况可以省略&号或括号: SUMDATA($a, $b); SUMDATA $a, $b (这种情况要前...
  • hope_smile
  • hope_smile
  • 2015年05月29日 02:33
  • 2300

PERL语言入门:第四章:子程序(函数):参数与子程序的私有变量

默认情况下, perl中的所有变量都是全局的。 如果要创建私有变量, 可以用my关键字, 它能另一个变量局限于子程序或一个语句块中。({ } 为一个语句块) 在perl中, 函数的参数会...
  • hope_smile
  • hope_smile
  • 2015年06月09日 14:37
  • 590

PERL语言入门:第四章:子程序(函数):习题1:写一个程序, 求所有参数的和

#!/usr/bin/perl use warnings; use strict; sub sub_max{ my $sum; foreach (@_){ $sum += $_; } ...
  • hope_smile
  • hope_smile
  • 2015年06月09日 15:22
  • 582

perl中子程序中参数的两种引用(传递)方式介绍

转载自:http://www.jb51.net/article/34392.htm 这里主要讨论的是当你要传递的参数不是仅仅一个的时候,也就是两个以上,并且他们数据的类型还不一致的时候,我们要遇到的...
  • xuanyuanlei1020
  • xuanyuanlei1020
  • 2015年07月01日 09:24
  • 688

Perl 子程序变量外部使用--又称为闭包

my $var = "aaaaaaaaa"; print "1---\$var is $var\n"; &fun1; &fun2; #子程序用的变量会被销毁 print "3---\$var2 ...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2015年02月01日 15:03
  • 554

perl 传递数组作为参数

#perl #\ ,取地址 sub array {      my ($arr1,$arr2...
  • kelsel
  • kelsel
  • 2016年10月08日 17:19
  • 1089
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Perl Learning (4) —— 子程序
举报原因:
原因补充:

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