Per語言入門第4版學習筆記-第四章子程式

action929發表於2009-08-17
第四章子程式
4.1 定義一個子程式
4.2 呼叫子程式
4.3 返回值
4.4 引數(Arguments)
4.5 子程式中的私有變數
4.6 引數列表的長度
4.6.1 更好的&max 程式
4.6.2 空引數列表
4.7my 變數的註釋
4.8 使用strict Pragma
4.9 返回操作
4.9.1 省略符號&
4.10 非標量返回值[@more@]

第四章子程式

4.1 定義一個子程式
要定義自己的子程式,使用關鍵字sub,子程式的名字
sub marine {
$n + = 1; #全域性變數$n
print “Hello, sailor number $n!n”;
}
事實上,到現在為止所出現的所有變數均是全域性的

4.2 呼叫子程式
可以使用子程式的名字(帶有&)來呼叫子程式
&marine;

4.3 返回值
下面的子程式:
sub sum_of_fred_and_barney{
print “Hey, you called the sum_of_fred_and_barney suroutine!n”;
$fred + $barney; #返回值
}
子程式中最後一個被計算的表示式為$fred + $barney,因此$fred 和$barney 的和將被返回。
如果最後一個被計算的表示式不是$fred + $barney;而是print 語句。其返回值通常為1。

4.4 引數(Arguments)
Perl 子程式可以帶引數。將引數列表傳給子程式中的方法是,在程式名後面接括號,括號記憶體放引數列表,如:
$n = &max(10,15); #此子程式有2 個引數
在Perl 中,會自動將此引數列表(此引數列表的另一個名字)自動存放在一個叫做@_的陣列中。
這也就是說此子程式引數的第一個值存放在$_[0]中,第二個存放在$_[1],依次類推。

4.5 子程式中的私有變數
Perl 在每一次呼叫時提供@_這個私有變數,那它可以給我們提供私有變數。
sub max {
my($m,$n); #新的,私有變數
($m,$n) = @_; #賦值
if($m > $n) {$m} else{$n}
}
這些變數是此程式碼塊中的私有的(或者區域性的)變數;別的$m 和$n 不會影響此處的兩個變數。而且,其它地方的程式碼不能訪問或者修改這些變數

4.6 引數列表的長度
子程式可以容易的檢測@_是否含有恰當的個數。
sub max{
if(@_!=2){
print “WARNING! &max should get exactly two arguments!n”;
}
#continue as before….
.
.
.
}
4.6.1 更好的&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;
}

4.6.2 空引數列表

4.7my 變數的註釋
這些區域性變數可以在任意塊中使用,不僅僅是子程式中。例如,可以在if,while,foreach 等塊中使用:
foreach (1..10){
my($square) = $_*$_; #本迴圈中的私有變數
print “$_ squared is $squrare.n”;
}

4.8 使用strict Pragma
你可能希望Perl 嚴格一些;那可以使用strict pragma。
告訴Perl 進行更嚴格的語法檢測,需要在程式頂端use strict


4.9 返回操作
return 返回值,不再執行後續操作

4.9.1 省略符號&
有幾條規則確定在呼叫子程式時是否可以省略掉&。
如果編譯器在呼叫之前知道此子程式的定義,或者Perl 從語法中能知道這是一個子程式呼叫,則子程式前的符號&是可以省略的,像使用內嵌(built-in)函式一樣。
總的來說就是,如果你寫的子程式的名字和perl的預設函式 沒有重名的,就可以省略&


4.10 非標量返回值
sub list_from_fred_to_barney {
if($fred < $barney) {
#Count upwards from $fred to $barney
$fred ..$banrey
} else {
#Count downwards from $fred to $barney
reverse $barney ..$fred;
}
$fred = 11;
$barney = 6;
@c = &list_from_fred_to_barney; 為(11,10,9,8,7,6)

4.11
1.
#!/usr/bin/perl
sub total{
$tot = 0;
foreach $num (@_) {
$tot = $tot + $num;
}
$tot;
}

my @fred=qw{ 1 3 5 7 9 };
my $fred_total = &total(@fred);
print "The total of @fred is $fred_total.n";
print "Enter some numbers on separate lines:";
my $user_total = &total();
print "Tht total of those numbers is $user_total.n";

2.
#!/usr/bin/perl
sub total{
$tot = 0;
foreach $num (@_) {
$tot = $tot + $num;
}
$tot;
}

my @fred=( 1..1000 );
my $fred_total = &total(@fred);
print "The total of 1+...+1000 is $fred_total.n";

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133835/viewspace-1026097/,如需轉載,請註明出處,否則將追究法律責任。

相關文章