perl 语言支持自定义函数, 通过自定义函数, 我们可以重复利用已有代码, 提供工作效率, 简短代码行数.我们可以封装一些常用的方法存储起来, 以后需要用到的时候,直接拿来用就行了, 不用再重复开发了.
perl 语言变量按作用域分,可分为全局变量和局部变量.
#定义字符哈希
%char_hs = ( A, 'a', B, 'b', C, 'c');
#获取哈希的key 列表
@keys = keys %char_hs;
#for 中定义的key 和 value 只能在for 循环中访问
for my $key (@keys){
my $value = $char_hs{$key};
}
print "$key -> $value \n";
# 函数中定义的局部变量只能在函数块儿中访问
sub sayHello(){
# 如果同时定义两个局部变量, 必须使用()括起来,否则只会定义第一个.
my (name1, name2) = ("mirror", "zong");
print "hello, $name1 and $name2\n";
}
&hello;
print "name1:$name1, name2:$name2\n";
#函数定义
sub sayHello(){
print "hello,world";
}
#函数调用
&sayHello;
sub hello(){
# 获取参数个数
my length = @_;
# 复制参数
my $param = $_[0];
# 获取并删除删除
my $name = shift @_;
}
$name = "mirror";
&hello($name);
sub hello(){
# 复制参数列表
my @array = @_;
}
#传入多个标量或直接量参数
& hello("mirror", "ghost");
#传入数组
@names = ("mirror", "ghost");
& hello(@names);
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);
函数参数可以是标量, 哈希, 数组直接的混合传入, 但是如果哈希和数组进行了混合, 那么在方法内不好分离. 因为函数内部分离的方式是, 先使用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);
sub hello(){
return "mirrror";
}
$name = &hello();
sub hello(){
my @books = ("java", "mysql", "linux");
return @books;
}
@books = &hello();
sub hello(){
%char_hs = (A, 'a', B, 'b', C, 'c');
return %char_hs;
}
%char_hs = &hello();
#!/usr/bin/perl
#开启警告提示
use strict;
print "\n#################### 函数参数 ####################\n";
#标量
sub param_1(){
# 从@_中弹出第一个参数,@_中会删除这个参数
my $param = shift @_;
print "param: $param\n";
}
#数组
sub param_2(){
# 复制参数列表@_为@params,对@params 修改不会影响@_数组
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";
}
#################### 函数参数 ####################
#################### 测试函数参数: ####################
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