设为首页 收藏本站
查看: 804|回复: 0

[经验分享] Perl学习笔记 Learning Perl Chapter IV

[复制链接]

尚未签到

发表于 2015-12-28 09:02:52 | 显示全部楼层 |阅读模式
第四章 子程序,用户定义的函数,区别于内置函数

1.Defining a Subroutine 定义子程序
使用关键字sub:
sub routine { body }.

2.Invoking a Subroutine 调用子程序
用 &subroutinename

3.Return Values 返回值
子程序中最后执行的语句的结果作为本子程序的返回值,如果子程序最后并不执行计算,不同的操作不同的上下文有不同返回值,如:
sub example{
$a+$b;
}                                 #返回$a+$b的值
sub example{
print "what is this?\n";
}                                 #返回1
sub example{
@a=qw/what the fuck/;
@b=sort @a;
}                                  #返回3

sub example{
@a=qw/what the fuck/;
$b=sort @a;              #返回undef
}   
sub  example{
@a=qw/again this array/;
@b=reverse @a;         #返回3
}

sub  example{
@a=qw/again this array/;
$b=reverse @a;          #返回kcufehttahw
}
sub alternative{
if($a lt $b){
$b;}
else{
$a;}
}                                #返回较大值

4.Arguments 参数
可以给子程序传递参数,有意思的是,定义子程序时并不必使用形参,参数默认存在一个叫@_的数组中,@_是局部变量,在子程序内部可直接使用其中元素如$_[0]:
sub whichIsLarger{
if($_[0]>$_[1]){
       $_[0];
}else{
     $_[1];
   }
}
$a=&whichIsLarger(10,12);
但是这种方式下,参数数目必须弄清楚,传递时,多余的参数值被忽略,缺省的参数值为undef

5.Private Variables in Subroutines 子程序中局部变量
理所应当的,子程序中可以定义自己的局部变量,使用关键字my:
sub example{
my($a,$b)=@_;
……
}

6.Variable-Length Parameter Lists 变长参数列表
perl,可以给子程序传递任意长度的参数列表,如4中所述,也可以测试参数列表长度if(@_!= number)来处理特殊情况
一个小example做一个小总结:
#求数组中元素的最大值
@a=(1,4,2,8,5,7);
$maxone=&max(@a);
sub max{
my($res)=shift @_;
foreach (@_){
if($_>$res){
$res=$_;
     }
  }
$res;
}
但是,如果@a为空,返回值是什么?    undef!

7.Notes on Lexical Variables 局部变量的一些说明
用my定义局部变量可以用在子程序以外的任何程序段中,器其作用域为包含它的最小程序模块
6中定义的局部变量实际上是在list上下文中,my同样可以用到scalar上下文中,如下例:
my($a) = @_;         #list上下文:把@_中首元素的值赋给$a
my $a  = @_;          #scalar上下文:$a存储@_中元素的个数
可以看出,使用my,不加括号只是声明一个局部scalar变量,加括号声明局部数组,当然也可以这样声明数组:
my @arrayname;

8.The use strict Pragma  use strict 预处理命令
perl太灵活,可能会带来一些编程上的麻烦,如:使用新变量不需先定义,这导致细微的拼写错误就相当于定义了个新变量,很难察觉
perl提供了use strict预处理命令,强制使用一系列更加严格的语法,比如新变量必须用my 定义,这样任何未定义的变量会使编译器报错。
推荐在程序中尽量使用use strict

9.The return Operator return 操作符
跟其他编程语言一样,用return可以让子程序立即返回一个值

10.Omitting the Ampersand 去掉&
在不引起歧义的前提下,调用子程序时不必要的&可以省略:
my $a = iAmSub(@iAmArgue);
注意:perl允许内置函数和自定义函数同名,此时,若想调用自定义函数,就必须使用&了
在已定义了子程序的情况下,参数列表的括号()也可以省略省略:
sub marine{
$_[0]+$_[1];
}
my $res = marine 123,124;

11.None-Scalar Return Values 非scalar类型的返回值
子程序的返回值可以是其他类型的值,比如一个数的序列,undef,空的list

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157249-1-1.html 上篇帖子: 关于perl:Fatal: failed to find source perl5db.pl for epic_breakpoints.pm解决方法 下篇帖子: Perl文件内容对比
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表