Perl可以定义子例程, 也即是通俗讲的函数.
子例程可以使程序代码的可重用性加强, 使代码简洁而易于维护.
Perl中的子例程源自独立的命名空间, 所以即是存在一个与子例程相同名字的
变量, 也不会产生二义性. 如:
&subcall;
$subcall;
子例程的定义
子例程的定义可以放在程序中的任意位置:
即子例程的定义既可以放在程序的开头, 也可以放在程序的结尾.
与C等许多编程语言不同, Perl的子例程通常不需要前置声明.
定义子例程,采用如下形式:
关键字sub + 子例程的名字(不含&符号) + 子例程程序代码块(用花括号包含).
如:
sub sayHello
{
print "Hello, everyone, nice to meet you/n";
}
子例程的调用
在任意表达式中, 只要使用子例程的名称(前面加上&符号),即是调用子例程.
如, 调用上述定义的子例程sayHello,
&sayHello; #输出 Hello, everyone, nice to meet you
子例程的参数
在Perl中,子例程也可以带参数的形式调用:只要将要传递的参数列表放于
子例程调用后面的括号内. 如
sub max_
{
if($_[0] > $_[1])
{
$_[0];
}else
{
$_[1];
}
}
&max_(4,5); #本子例程调用有两个传递参数:4 & 5
Perl会自动地讲子例程的参数列表存储到名为@_的特定数组变量中供程序员使用,
@_在子例程执行其间都是有效的。通过访问该数组, 可以确定参数的个数和这些参数
所对应的值.
注意:@_是每个子例程调用的私有变量,假如已经有了全局变量@_, 则该全局变量在
子例程调用前会先保存起来, 并在子例程返回时恢复原本的值. 这也意味着子例程
可以将参数传递给其它的子例程,而不用担心遗失自己的@_变量.
如:
#!C:/Perl/bin
use strict;
use warnings;
sub print1_
{
my ($str1, $str2) = @_;
print "$str1 $str2/n"; #输出 hello my name is shark
&print2_("good","today is warm"); # 输出 good today is warm
($str1, $str2) = @_;
print "$str1 $str2/n"; #输出 hello my name is shark
}
sub print2_
{
my ($str1, $str2) = @_;
print "$str1/n$str2/n";
}
&print1_("hello","my name is shark");
子例程的返回值
Perl会将子例程执行过程中的最后一次运算结果作为返回值.
注意:
1:与其它一些编程语言不同,在Perl中,任何子例程都是有返回值的;
然而, 并不是任何Perl子例程都会提供有用的返回值.
2:最后一次运算是指"最后执行的表达式", 而不是子例程代码块中的
最后一行.
如:
#将会将两个输入参数的较大数作为返回值返回
sub max_
{
if($_[0] >= $_[1])
{
$[0];
}
else
{
$[1];
}
}
当然,也可以通过return操作符来返回某个值。
return会马上返回值, 而不会执行子例程的其余部分,如下的子例程,
当碰到第一个大于50的数时,即返回该数.
sub bg_
{
foreach (@_)
{
return $_ if($_ > 50);
}
-1; # 没找到, 则返回-1
}