函数(子程序):
Perl中的函数括号可以写也可以不写,除非不写影响含义。
自定义子程序:
sub function-name{
expressions;
}
子程序的返回值:
所有perl子程序都有返回值,子程序中最后一个语句运算结果默认是程序的返回值。
return操作符会从子程序立即返回某个值。
子程序参数:
给子程序传参数只需要在调用子程序时在子程序后面加上圆括号和参数就可以了。
perl将参数列表存放在 @_ 这个特殊数组变量中,子程序获取整个变量得到参数个数和参数值。
这个特殊的数组变量只在子程序执行期间有效。在子程序中使用$_[n]表示每个参数的值。
@_ 是子程序的私有变量,每个子程序都有一个自己的@_。
子程序的私有参数:
Perl中默认的变量都是全局变量。
可以使用my操作符来创建私有的词法变量和数组(其实拥有列表的值)。
my arg1, arg2; #my只能私有一个变量arg1,arg2不会被私有化。
my (arg1, arg2); #使用括号可以同时私有括号内的变量。
私有变量和数组只在当前的块(子程序,控制流等)中有效。
词法变量不能保留变量的值。
建议所有参数的第一次出现都使用my
my ($arg1, $arg2, …);
($arg1, $arg2, …) = @_;
等效于:
my(arg1, arg2, …) = @_; #直接创建私有变量并赋值。
长参数列表:
sub function {
If (@_ != 2) {
Print “Warning! The argument is wrong.\n”;
}
持久性私有变量:
使用my申明的词法变量不能保存变量的值,而且每次调用这个词法变量都可能被赋予不同的值。
使用state申明变量,这个变量还是私有变量,但是可以在子程序多次调用期间保留变量的值。
state $arg/@arr;
调用子程序:
如果子程序的定义在调用之前可以写成可以像调用内置函数一样:
function arg1, arg2;
建议所有子程序调用都使用&参数用括号:
&function(arg1, arg2, …);
如果自定义字函数和内置函数同名使用&调用的是自定义函数,不使用&调用的是内置函数。
--------------------------------------------------
排序子函数:
数字排序
sub by_number {$a <=> $b}
my @result = sort by_number @numbers;
等效于:
my @result = sort {$a<=> $b} @numbers; #从小到大排序
my @result = reverse sort{$a<=> $b} @numbers; #从大到小排序
my @result = sort{$b<=> $a} @numbers; #从大到小排序
字符串排序
sub ASCIIbeticaly {$a cmp $b }
sort ASCIIbetically @strings;
转换成小写字母排序
sub case_insensitive { “\L$a” cmp “\L$b” }
sort case_insensitive @strings;
哈希值排序:
sub by_value{ $hash{$b} <=>$hash{$a}} #哈希的值从大到小排序。
my @result = sort by_value keys %hash;
foreach my $keys (@result){
print “$keys => $score{$keys}\n”;
}
sub by_value_and_key{
$hash{$b} <=> $hash{$a}
or
$a cmp $b
}
my @result = sortby_value_and_key keys %hash;