perl: 函数和排序

函数(子程序):

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;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。