perl-子程序
自从学完reference就感觉轻松了不少!
subroutine
子程序(函数):
- 一个代码块。A Perl function or subroutine is a group of statements that together perform a specific task
- perl中可以放到任意位置,并不像shell中必须放到最开头。还可以跨文件访问:使用
use
或do
或require
语法:
1 | sub NAME PROTOTYPES ATTRIBUTES BLOCK |
sub:表示这是一个函数
name:函数名称,它有自己独立的命名空间,所以可以使用已有的标量变量的名称,并不冲突。
1
2
3eg:
$scale = 'iu';
sub scale = {....}prototypes:函数期望什么参数,并不常用
attribute:属性,包含了
locked
,method
andlvalue
,并不常用block:放函数主体
1 | sub say_something{ |
调用:
使用&subroutine_name
或者subroutine_name()
1 | &say_something; |
但是&
更为通用,比如说在reference时:
1 | $say_somethingRef = \&say_something; |
dereference:
1 | &\$say_somethingRef |
传参
1 | sub test{ |
使用&subroutine_name
写法时:
1 | # 直接将参数传过去,其它的写法不行 |
使用subroutine_name()
写法时:
1 | # 各种都支持 |
注意点:
由于在函数外定义的变量为全局变量,所以如果在函数中对其数据就行了修改,会影响原始数据,这个与python差别就很大了。这被称为通过reference传值
1
2
3sub getreference{
$_[0] = 'iu';
}
那么如何避免修改函数外部的变量,定义函数内部的变量,将函数外部传进来的值重新变为函数内部的。这被称为通过value传值
1
2
3sub getvalue{
my @list = @_;
}
1 | #!/usr/bin/perl |
当然,如果要是合并两个数组,并不需要这么写,可以直接合并
1 | @one = (1,2,3,4,5); |
返回值
默认返回最后一个执行的语句。不需要写
return
1
2
3
4
5
6print &say_hi , "\n";
sub say_hi{
my $name = 'Bob';
print "Hi $name \n";
$name; #默认返回这个语句
}
也可以使用
return
来显式的说明要返回值,return可以写在函数内部任意位置,但是return之后的语句不会执行1
2
3
4
5sub say_hi{
my $name = 'Bob';
print "Hi $name \n";
return $name; #用return返回值
}
参数校验
我们一般会在函数中对传进来的值进行校验,如果不存在那么就返回一个undef
,可以配合调用函数时的if
检测是否传值正确。
1 | #!/usr/bin/perl |