子程序,類比c語言中的函數,在形式上個人認爲最大的區別:沒有形參
1.1.定義子程序
1.2.調用
#! /usr/bin/perl
sub marine { $n += 1 ; print "$n\n" ; } &marine; &marine; |
1.3.返回值
1.3.1. 基本原則
所有的Perl 子程序都會返回值,在Perl 中返回值和不返回值是沒有區別的。當然,不是所有Perl子程序返回的值都是有用的。
由於所有的被調用的子程序都要返回值,因此使用特殊的返回值語法在大多數情況下是一種浪費。因此Larry將之簡化了。當Perl 遍歷此子程序時,將會計算每一步的值。此子程序中最後計算的值將被返回。
#! /usr/bin/perl
$num1 = 10 ; $num2 = 20 ; sub marine { $n += 1 ; print "$n\n" ; $num1 + $num2 ; } &marine; &marine; print 1 + &marine,"\n" ; |
所有的函數都會有返回值:
print 語句,其返回值通常爲1,意思是“print was succfessful(打印成功)”
1.3.2. return
直接調用return情況也是有的
#! /usr/bin/perl use strict ;
my @names = qw /fred barney betty dinoWilma pebbles bam-bamm/; my $result = &which_element_is("dino", @names); print $result ,"\n";
my $result = &which_element_is("betty", @names); print $result ,"\n"; # sub which_element_is { my($what, @array) = @_; foreach(0..$#array){ #@array元素的索引 if($what eq $array[$_]){ return $_; #找到既返回 } } -1; #沒有找到元素(此處是可選的) } |
1.3.3. 返回列表
1.4.參數
Perl 子程序將參數列表傳給子程序中的方法是,在程序名後面接括號,括號內存放參數列表,如:$n = &max(10,15); #此子程序有2個參數
此參數列表被傳到子程序中,這些參數可以被子程序使用。當然,這些參存放在某個地方,在Perl中,會自動將此參數列表(此參數列表的另一個名字)自動存放在一個叫做@_的數組中。子程序可以訪問次數組變量來確定此參數的個數以及其值,子程序參數的第一個值存放在$_[0]中,第二個存放在$_[1],依次類推。
Perl 不會關心是否有多餘的變量。參數不夠時也會被忽略,當傳入的參數個數不夠時,不夠的參數會得到undef這個值。
@_是子程序的一個私有變量,如果有一個全局變量@_,它將在此子程序調用前存儲起來,當子程序調用完成後,其早期的值會被重新賦還給@_。這意味着當將參數傳遞給子程序時不用擔心它會影響此程序中其它子程序的@_這個變量的值。
嵌套的子程序調用時,@_的值和上述類似。甚至此子程序遞歸調用時,每一次調用將得到新的@_,因此子程序調用時將得到其自身的參數列表。
注意:
調用的子程序沒有參數時,此時@_從此調用者的上下文(context)得到。這通常不是個好主意,但有時很有用。
在調用子程序時,參數會在子程序中被修改。
#! /usr/bin/perl
$num1 = 10 ; $num2 = 20 ; sub marine { $n += 1 ; print "$n\n" ; $num1 + $num2 ; $_[0] += 20 ; } &marine; &marine; print 1 + &marine,"\n" ;
$arg = 10 ; &marine($arg) ; print $arg ,"\n"; |
更高級的max,可以不用限制參數個數
$maximum = &max(3,5,10,4,6); sub max { my($max_so_far) = shift @_; foreach (@_){ if($_>$max_so_far){ $max_so_far=$_; } } $max_so_far; } |
1.5.子程序私有變量
使用my創建私有變量:
sub max {
my($m,$n) = @_; #局部變量賦值
if($m > $n) {$m} else{$n}
}
上面的一條語句創建了一些私有變量並給它們賦值,第一個爲$m,第二個爲$n。幾乎每一個子程序都由類似的語句開頭。當看見那一行時,你就知道此子程序需要2個變量,在此子程序中分別被叫做$m和$n。
1.6.strict pragrma
在程序頂端use strict(或者在任意塊或者文件中,如果你需要在此部分使用它),Perl進行更嚴格的語法檢測。
許多人推薦如果程序長度大於一個屏幕,則需要使用use strict