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

[经验分享] Perl专题之函数(一)函数基本语法

[复制链接]
发表于 2018-8-31 06:12:50 | 显示全部楼层 |阅读模式
1. 函数的基本语法
1.1.函数的声明与定义
  Perl函数声明的语法为:
   sub NAME [PROTOTYPE] [ATTRIBUTE]
  Perl函数定义的语法为:
   sub [NAME] [PROTOTYPE] [ATTRIBUTE] BLOCK
  函数声明与定义的各个组成部分含义如下:
  sub(函数关键字):Perl中的子函数关键字,不可省略。
  NAME(函数名字):函数名字在函数声明中是必需的,而在函数定义中则是可选的。在函数定义中如果省略函数名则表示声明了一个匿名函数,此时需要提供一个调用匿名函数的方式,这将在1.2节阐述。
  PROTOTYPE(函数原型):用来定义函数出入参数的格式。
  ATTRIBUTE(函数属性):用来定义函数的属性,这部分内容将在后续专题中进行讨论,本文不做赘述。
  BLOCK(函数体):函数的代码体,只存在函数的定义中。
1.2.函数的调用方式
  Perl中函数的调用方式主要有三种:
  通过函数名直接调用
  使用前置&号调用
  使用引用调用
1.2.1.  通过函数名直接调用
  这种调用方法只能调用命名函数。它的调用语法为:
  NAME[(param1,param2,…)]
  如果函数调用之前已经做了函数的声明或者定义,那么函数名字后面的括号是可以省略的。如果函数在调用之前没有做函数的声明或者定义,后面的括号不可省略。
  我们做一个如下的测试脚本:
  =pod
  脚本名称:01_direct_call.pl
  脚本目的:改脚本用来测试使用函数名字直接调用函数的语法
  作   者:加水石灰
  =cut
  sub func_pre_definition{
     print "func_pre_definition被调用\n";
  }
  sub func_pre_declaration;
  func_pre_definition();
  func_pre_definition;
  func_pre_declaration();
  func_pre_declaration;
  func_post_definition();
  func_post_definition;
  sub func_pre_declaration{
     print "func_pre_declaration被调用\n";
  }
  sub func_post_definition{
     print "func_post_definition被调用\n";
  }
  func_post_definition;
  上面脚本的输出结果如下:
  Useless use of aconstant ("func_post_definition") in void context at01_direct_call.pl line 17.
  func_pre_definition被调用
  func_pre_definition被调用
  func_pre_declaration被调用
  func_pre_declaration被调用
  func_post_definition被调用
  func_post_definition被调用
  从上述结果可以看到Perl解释器对改脚本发出警告,在代码的第17行中对函数func_post_definition的调用被理解为一个裸字符串,而没有理解成一个函数调用。
  这种调用方式和Perl内置函数的调用方式是一样的,Perl函数很多的特性都只能作用于这种调用方式,比如函数原型、内联函数等等。函数原型和内联函数将在后文中阐述。
1.2.2.  &+NAME方式调用
  这种调用方式也只能调用命名函数。它的调用语法为:
  &NAME[(pamram1,param2,…)]
  这种调用方式下,不论声明或者定义是否在函数调用之前,函数名后面的括号均可以省略,因为符号&明确告诉Perl解释器这是一个函数调用,Perl解释器会在所有可见的名字空间中寻找该函数,如果找不到会报运行时错误。
  我们做一个测试脚本如下:
  =pod
  脚本名称:02_and_call.pl
  脚本目的:改脚本用来测试使用&+函数名字直接调用函数的语法
  作   者:加水石灰
  =cut
  sub func_pre_definition{
     print "func_pre_definition被调用\n";
  }
  sub func_pre_declaration;
  &func_pre_definition();
  &func_pre_definition;
  &func_pre_declaration();
  &func_pre_declaration;
  &func_post_definition();
  &func_post_definition;
  &func_err;
  sub func_pre_declaration{
     print "func_pre_declaration被调用\n";
  }
  sub func_post_definition{
     print "func_post_definition被调用\n";
  }
  上述代码的输出结果为:
  func_pre_definition被调用
  func_pre_definition被调用
  func_pre_declaration被调用
  func_pre_declaration被调用
  func_post_definition被调用
  func_post_definition被调用
  Undefined subroutine &main::func_errcalled at 02_and_call.pl line 18.
  这种调用方式会屏蔽函数的原型声明和阻止成为内联函数。如果需要将函数作为参数传递给其它函数或者以&$subref()的方式调用函数的时候,&是不可省略的。
1.2.3.  通过引用调用函数
  这种调用方式既可以调用命名函数也可以调用匿名函数。调用匿名函数时需要用一个标量变量来保存对匿名函数的引用。这种方式的调用语法有以下两种:
  &$subref[()]
  $subref->()
  &$subref
  我们做如下测试脚本:
  =pod
  脚本名称:03_ref_call.pl
  脚本目的:改脚本用来测试使用引用调用函数的语法
  作   者:加水石灰
  =cut
  $subref="func_post_definition";
  &$subref();
  &$subref;
  $subref->();
  $subref=\&func_post_definition;
  &$subref();
  &$subref;
  $subref->();
  sub func_post_definition{
  print"func_post_definition被调用\n";
  }
  以上测试代码的输出为:
  func_post_definition被调用
  func_post_definition被调用
  func_post_definition被调用
  func_post_definition被调用
  func_post_definition被调用
  func_post_definition被调用
  引用调用还可以调用匿名函数,但首先要保存一个匿名函数的引用。保存匿名函数的引用的语法如下:
  $subref=sub BLOCK;
  保存了匿名函数的引用之后,调用方式同上面命名函数的引用调用方式相同。
  我们做如下的测试脚本:
  $subref2=sub {print "匿名函数被调用\n"};
  &$subref2();
  &$subref2;
  $subref2->()
  以上代码的测试结果如下:
  匿名函数被调用
  匿名函数被调用
  匿名函数被调用


运维网声明 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-559007-1-1.html 上篇帖子: Linux运维课程-Perl脚本(正则表达式的使用) 下篇帖子: perl mojo安装时curl提示没有证书的解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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