Perl专题之函数(一)函数基本语法
来源:互联网 发布:淘宝好吃的美食 编辑:程序博客网 时间:2024/05/12 17:16
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->()
以上代码的测试结果如下:
匿名函数被调用
匿名函数被调用
匿名函数被调用
- Perl专题之函数(一)函数基本语法
- Perl专题之函数(三)函数原型
- Oracle学习之基本语法(一)—内置函数
- Perl专题之函数(二)函数参数与返回值
- Perl基本语法实例,变量,数组,函数,if, for, while
- C#基本语法之C#函数重载
- go基本语法学习笔记之函数
- Kotlin——程序的灵魂组成之变量、属性和函数的基本语法(一)
- 函数模板基本语法
- 基本语法(注释、函数和属性)
- Feekood基本语法(4)-- 函数
- Swift基本语法(二)函数
- 我的Python学习之路之基本语法-函数
- lua基本函数(一)
- Oracle基本语法之DDL(一)
- LINQ专题——基本函数篇(1)
- perl学习之:字符串函数
- swift基本语法(总结提炼版)之010 swift 之函数
- Callback在C\C++中的实现
- 数据结构-图
- Infinite Mixture Models with Nonparametric Bayes and the Dirichlet Process
- MongoDB 自动分片 (一) (Auto-Sharding)
- 百度为啥不搞Bmail?
- Perl专题之函数(一)函数基本语法
- Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)
- 安装Maven报错:Network connection problems encountered during search
- c++ vector容器的特性(权哥)
- Jquery日期、时间选择插件
- 用mapreduce来操作hbase的两点优化
- [MySQL] 复制(2)- 创建主备复制(主备库都为空)
- 算法编写步骤
- Ubuntu软件推荐:apk安装器