perl 语言支持自定义函数, 通过自定义函数, 我们可以重复利用已有代码, 提供工作效率, 简短代码行数.我们可以封装一些常用的方法存储起来, 以后需要用到的时候,直接拿来用就行了, 不用再重复开发了.
1. perl 函数特点
函数定义使用关键字 sub + 函数名函数调用使用关键字 & + 函数名函数参数为一个无限制长度的列表直接量函数都有一个返回值, 为一个无限制的列表直接量, 可使用return 返回函数名不能以数字开头, 可由字母,数字,下划线组成函数体由大括号{} 限制函数可在脚本中任意位置定义, 在使用前, 不需要对函数做实现声明函数定义属于全局的
2. 变量作用域
perl 语言变量按作用域分,可分为全局变量和局部变量.
全局变量: 作用域为整个perl 脚本, 不加关键字my 和 自动创建的变量都属于全局变量局部变量: 定义变量时, 使用my 修饰的变量为全局变量, 作用域为最近的一个{} 之间, 超出这个范围则不能访问定义的变量, 因此局部变量又称私有变量.
2.1 循环中定义私有变量
%char_hs = ( A
, 'a', B
, 'b', C
, 'c');
@keys = keys
%char_hs;
for my $key (@keys){
my $value = $char_hs{$key};
}
print "$key -> $value \n";
2.2 函数中定义
sub sayHello(){
my (name1
, name2
) = ("mirror", "zong");
print "hello, $name1 and $name2\n";
}
&hello;
print "name1:$name1, name2:$name2\n";
3. 函数定义和调用
函数定义: sub funName () {}函数调用: &funName (param…);
sub sayHello(){
print "hello,world";
}
&sayHello;
4. 函数传参
调用函数时, 所传入的所有参数都会存入@_数组中, 无论你传的是标量, 数组, 还是哈希, 都会自动转换并存储在@这个数组中, 可以通过$[idx]来获取具体参数
4.1 标量
函数只接受一个参数时,通常是用标量接受如果传入为标量, 在函数内修改参数的值, 不会影响标量的值
sub hello(){
my length
= @_;
my $param = $_[0];
my $name = shift
@_;
}
$name = "mirror";
&hello($name);
4.2 数组
函数调用时, 可以传入多个标量或直接量参数, 或一个数组参数, 函数中可用一个数组接收如果函数传入的是一个数组, 在函数内部修改数组元素, 不会影响原来的数组
sub hello(){
my @array = @_;
}
& hello
("mirror", "ghost");
@names = ("mirror", "ghost");
& hello
(@names);
4.3 哈希
函数调用时可以传入一个哈希作为参数,函数中修改哈希不会影响原来的哈希
sub hello(){
my %hash = @_;
my @keys = keys
%hash;
my @values = values
%hash;
print "keys: @keys, values: @values \n";
}
%char_hs = (A
, 'a', B
, 'b', C
, 'c');
&hello(%char_hs);
4.4 标量数组混合
函数参数可以是标量, 哈希, 数组直接的混合传入, 但是如果哈希和数组进行了混合, 那么在方法内不好分离. 因为函数内部分离的方式是, 先使用shift @_ 将标量弹出, 最后将剩余的参数全部转换为数组或者哈希.
标量和数组混合: 只能和一个数组混合, 数组最后传入数组和哈希混合: 只能喝一个哈希混合, 哈希最后传入
sub hello(){
my $name = shift
@_;
my @books = @_;
}
sub hello2(){
my $name = shift
@_;
my %book_hs = @_;
}
@books = ("java", "mysql", "linux");
@char_hs = (A
, 'a', B
, 'b', C
, 'c');
&hello("mirror", @books);
@hello("mirror", $char_hs);
5. 函数返回值
perl 中每一个函数都有一个返回值, 返回值底层都是列表, 可使用标量, 数组, 哈希接收.
5.1 标量
sub hello(){
return
"mirrror";
}
$name = &hello();
5.2 列表
sub hello(){
my @books = ("java", "mysql", "linux");
return
@books;
}
@books = &hello();
5.3 哈希
sub hello(){
%char_hs = (A
, 'a', B
, 'b', C
, 'c');
return
%char_hs;
}
%char_hs = &hello();
6. 测试用例
6.1 测试脚本
use strict
;
print "\n#################### 函数参数 ####################\n";
sub param_1(){
my $param = shift
@_;
print "param: $param\n";
}
sub param_2(){
my @params = @_;
print "params: @params\n";
}
sub param_3(){
my %hash = @_;
my @keys = keys
%hash;
my @values = values
%hash;
print "keys: @keys, values: @values \n";
}
sub return_1(){
return
"mirror";
}
sub return_2(){
my @arrays = ("mirror", "ghost");
return
@arrays;
}
sub return_3(){
%hash = (A
, 'a', B
, 'b', C
, 'c');
return
%hash;
}
print "\n#################### 测试函数参数: ####################\n";
$name = "mirror";
@names = ("mirror", "ghost", "zong");
%char_hs = (A
, 'a', B
, 'b', C
, 'c');
¶m_1($name);
¶m_2(@names);
¶m_3(%char_hs);
print "\n#################### 测试函数返回 ####################\n";
$return_name = &return_1();
print "return_name:$return_name \n";
@return_names = &return_2();
print "return_names:@return_names\n";
%return_hs = &return_3();
while (my ($key, $val) = each
%return_hs){
print "$key -> $val \n";
}
6.2 脚本输出
param: mirror
params: mirror ghost zong
keys: A C B, values: a c b
return_name:mirror
return_names:mirror ghost
A -
> a
C -
> c
B -
> b