Perl专题之函数(一)函数基本语法
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"; 上面脚本的输出结果如下: Useless use of aconstant ("func_post_definition") in void context at01_direct_call.pl line 17. func_pre_definition被调用 func_pre_declaration被调用 func_post_definition被调用 从上述结果可以看到Perl解释器对改脚本发出警告,在代码的第17行中对函数func_post_definition的调用被理解为一个裸字符串,而没有理解成一个函数调用。 这种调用方式和Perl内置函数的调用方式是一样的,Perl函数很多的特性都只能作用于这种调用方式,比如函数原型、内联函数等等。函数原型和内联函数将在后文中阐述。 1.2.2. ?&+NAME方式调用这种调用方式也只能调用命名函数。它的调用语法为: &NAME[(pamram1,sans-serif;font-size:12px;background-color:#ffffff;margin-top:4px;margin-bottom:4px;">这种调用方式下,不论声明或者定义是否在函数调用之前,函数名后面的括号均可以省略,因为符号&明确告诉Perl解释器这是一个函数调用,Perl解释器会在所有可见的名字空间中寻找该函数,如果找不到会报运行时错误。 我们做一个测试脚本如下: 脚本名称:02_and_call.pl 脚本目的:改脚本用来测试使用&+函数名字直接调用函数的语法 &func_pre_definition(); &func_pre_definition; &func_pre_declaration(); &func_pre_declaration; &func_post_definition(); &func_post_definition; &func_err; 上述代码的输出结果为: func_pre_definition被调用 func_pre_declaration被调用 func_post_definition被调用 Undefined subroutine &main::func_errcalled at 02_and_call.pl line 18. 这种调用方式会屏蔽函数的原型声明和阻止成为内联函数。如果需要将函数作为参数传递给其它函数或者以&$subref()的方式调用函数的时候,&是不可省略的。 1.2.3. ?通过引用调用函数这种调用方式既可以调用命名函数也可以调用匿名函数。调用匿名函数时需要用一个标量变量来保存对匿名函数的引用。这种方式的调用语法有以下两种: &$subref[()] $subref->() &$subref 我们做如下测试脚本: 脚本名称:03_ref_call.pl 脚本目的:改脚本用来测试使用引用调用函数的语法 $subref="func_post_definition"; &$subref(); &$subref; $subref->(); $subref=&;func_post_definition; print"func_post_definition被调用n"; 以上测试代码的输出为: 引用调用还可以调用匿名函数,但首先要保存一个匿名函数的引用。保存匿名函数的引用的语法如下: $subref=sub BLOCK; 保存了匿名函数的引用之后,调用方式同上面命名函数的引用调用方式相同。 我们做如下的测试脚本: $subref2=sub {print "匿名函数被调用n"}; &$subref2(); &$subref2; $subref2->() 以上代码的测试结果如下: 匿名函数被调用 匿名函数被调用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |