Function (subroutine):
 
 Function brackets in Perl can be written or not, unless the meaning is not affected.
 
  
 
 Custom subroutine:
 
 sub function-name {
 
     expressions;
 
 }
 
  
 
 Subroutine return value:
 
 All perl subroutines have a return value. The result of the last statement operation in the subroutine is the program's return value by default.
 
 The return operator returns a value immediately from a subroutine.
 
  
 
 Subroutine parameters:
 
 To pass parameters to a subroutine, just add parentheses and parameters after the subroutine when calling the subroutine.
 
 Perl stores the parameter list in a special array variable @_, and the subroutine gets the entire variable to get the number of parameters and the value of the parameter.
 
 This special array variable is valid only during subroutine execution. Use $ _ [n] in the subroutine to indicate the value of each parameter.
 
 @_ is a private variable of a subroutine, and each subroutine has its own @_.
 
  
 
 Subroutine private parameters:
 
 The default variables in Perl are global variables.
 
 You can use the my operator to create private lexical variables and arrays (which actually have the values of a list).
 
 my arg1, arg2; #my can only private one variable arg1, arg2 will not be privatized.
 
 my (arg1, arg2); #Using parentheses can also private variables in parentheses.
 
 Private variables and arrays are only valid in the current block (subroutine, control flow, etc.).
 
 Lexical variables cannot retain the value of a variable.
 
 It is recommended to use my for the first occurrence of all parameters
 
 my ($ arg1, $ arg2,…);
 
 ($ arg1, $ arg2,…) = @_;
 
 Equivalent to:
 
 my (arg1, arg2,…) = @_; #Create private variables directly and assign values.
 
  
 
 Long parameter list:
 
 sub function {
 
     If (@_! = 2) {
 
         Print “Warning! The argument is wrong. \ N”;
 
 }
 
  
 
 Persistent private variables:
 
 The lexical variable declared with my cannot save the value of the variable, and each call to this lexical variable may be assigned a different value.
 
 Use state to declare a variable, this variable is still private, but you can retain the value of the variable during multiple subroutine calls.
 
 state $ arg / @ arr;
 
  
 
 Call subroutine:
 
 If the definition of a subroutine can be written before calling it, it can be like calling a built-in function:
 
 function arg1, arg2;
 
 It is recommended that all subroutine calls use & parameters with parentheses:
 
 & function (arg1, arg2,…);
 
 If a custom word function and a built-in function use the same name and call a custom function, a function that does not use & calls a built-in function.
 
  
 
 --------------------------------------------------
 
 Sorting sub-functions:
 
  
 
 Number sort
 
 sub by_number {$ a <=> $ b}
 
 my @result = sort by_number @numbers;
 
 Equivalent to:
 
 my @result = sort {$ a <=> $ b} @numbers; #Sort from small to large
 
 my @result = reverse sort {$ a <=> $ b} @numbers; #Sort from big to small
 
 my @result = sort {$ b <=> $ a} @numbers; #Sort from big to small
 
  
 
 Sorting strings
 
 sub ASCIIbeticaly {$ a cmp $ b}
 
 sort ASCIIbetically @strings;
 
  
 
 Convert to lowercase sort
 
 sub case_insensitive {"\ L $ a" cmp "\ L $ b"}
 
 sort case_insensitive @strings;
 
  
 
 Sorting hash values:
 
 sub by_value {$ hash {$ b} <=> $ hash {$ a}} #The values of the hash are sorted from large to small.
 
 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: functions and sorting