-- 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