標籤: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;
perl: 函數和排序