-- Start
系统函数
Perl 提供了大量的函数供我们使用,详细列表见 perldoc。
自定义函数
自定义函数又称子程序(subroutine),子程序可以出现在程序的任何地方。一般放在程序的开始或结尾,下面是一个简单的例子。
#!/usr/bin/perl
# 定义子程序
sub max {
my ($num1,$num2) = @_;
if($num1 > $num2) {
return $num1;
} else {
return $num2;
}
}
# 调用子程序
my $n = 1;
my $m = 2;
my $bigger = &max($n,$m);
- Perl 使用 sub 关键字来定义子程序。
- Perl 使用 & 来调用子程序,在不引起歧义的情况下,& 可以省略,但不推荐这么做。原因是如果某个自定义函数和系统函数同名,则默认是调用系统函数。
- return 用来向调用者返回值,return 可以省略,默认情况下,子程序中最后执行的一个语句的值将作为返回值。
- 子程序的参数自动存储在@_数组中。特别要注意的是,当向子程序传递数组时,数组中的所有值都会被copy到@_中。
- my 关键字用来定义局部变量。
事实上,我们还可以在定义子程序的同时指定参数类型,下面是一个简单的例子。
#!/usr/bin/perl
# 定义子程序
sub max ($$) {
my ($num1,$m);
- 参数类型: 简单变量($),列表或数组(@),散列(%),匿名子程序(&),引用(*)
- 参数类型前加 表示强制类型一致
- 分号(;)用来分隔必须的参数和可选参数
我们已经知道了不能向传递标量那样向子程序传递数组,否则数组中的所有值都会被 copy 到@_ 中, 但是我们可以向子程序传递数组的引用,下面是一个简单的例子。
#!/usr/bin/perl
# 定义子程序
sub contains {
my ($array,$element) = @_; # 此处接收的是数组的引用,所以是 $array,而不是 @array
foreach my $e (@$array) {
if ($e eq $element) {
return 1;
}
}
return 0;
}
# 调用子程序
my @names = qw(小李 小张 小王);
my $name = "小李";
if(&contains(@names,$name)) { # 此处传递的是数组的引用
print "存在n";
} else {
print "不存在n";
}
全局变量与局部变量
全局变量
不加任何说明的变量为全局变量,它的作用范围为全局。
局部变量(my)
可以用 my 来修饰一个变量,此变量称为局部变量,它的作用范围为语句块。
局部变量(local)
可以用 local 来修饰一个变量,此变量也称为局部变量,它的作用范围为子程序及它调用的子程序。
#!/usr/bin/perl
# 定义子程序
sub test {
local $name = "张三";
&printName();
}
sub printName {
print "$name"; # 此处可以访问变量 $name
}
# 调用子程序
&test();
use strict 编译命令
Perl 是一种非常松散的语言,这种过于松散的结构导致很多错误无法被识别,如:我们定义了一个标量,在随后的运算过程中我们将标量名写错误了,这将导致最终的运算结果错误,但是 Perl 并不会报任何错误。所以我们推荐在每一个 Perl 脚本都使用 use strict 编译命令,它将执行严格的语法检查,每个变量都必须用 my 来修饰。如:下面的代码将会报错。
#!/usr/bin/perl
use strict;
$name = "张三";
print $name;
-- 更多参见:Perl 精萃
-- 声 明:转载请注明出处 -- Last Updated on 2012-06-25 -- Written by ShangBo on 2012-06-25 -- End