1. 子程序
函數的命名空間和列表,標量一樣,都是獨立的,不用擔心重名
1.1 定義一個子程序
sub marine {
$n + = 1; #全局變量$n
print “Hello, sailor number $n!/n”;
}
都是全局變量,私有變量前加my就行了
1.2 調用子函數
&marine; #輸出Hello, sailor number 1!
&marine; #輸出Hello, sailor number 2!
&marine; #輸出Hello, sailor number 3!
&marine; #輸出Hello, sailor number 4!
1.3 返回值
子函數裏最後一條語句的值爲返回值
如果最後是print 返回的是1,因爲它打印成功就會返回true,在特定的環境下就是1;
例子:
sub larger_of_fred_or_barney {
if ($fred > $barney){
$fred;
}else{
$barney;
}
}
1.4 參數
此參數列表被傳到子程序中;這些參數可以被子程序使用。當然,這些參存放在某個地方,在Perl 中,會自動將此參數列表(此參數列表的另一個名字)自動存放在一個叫做@_的數組中。子程序可以訪問次數組變量來確定此參數的個數以及其值。需要注意實際上@_和參數列表是同一個東西,你程序中改了他,也就改了傳入的變量。
每個子程序的@_都是獨立的,程序相互調用,遞歸等都不會有問題。
1.5 子程序中的私有變量
sub max {
my($m,$n); #新的,私有變量
($m,$n) = @_; #賦值
if($m > $n) {$m} else{$n}
}
私有變量的改變和@_沒有關係,所以和轉入的參數也沒有關係。
1.6 子程序參數個數
sub max{
if(@_!=2){
print “WARNING! &max should get exactly two arguments!/n”;
}
#continue as before….
.
.
.
}
在設計程序時應該充分考慮轉入參數各種個樣的情況。
1.7 局部變量的作用範圍是以塊爲單位的,塊就是if,while,foreach這種有大括號的地方。
#!/usr/bin/perl
my $a = "love";
if(true)
{
my $a = "legend";
print $a."/n";
}
print $a."/n";
結果:
legend@ubuntu:~/data/study/perl$ perl 4.7
legend
love
申明是注意寫法:
my $fred, $barney; #錯誤!沒有定義$barney
my ($fred, $barney); #兩個均定義了
1.8 Strict pragma用法
use strict; #迫使採用更嚴格的檢測
實際上感覺和warning差不多,只不過檢測的嚴格性加大了
1.9 Return語句
我們一樣很需要return語句,因爲有時你需要在子程序中某個地方就直接返回。
所以perl一樣支持顯示的retrun語句。
1.10 關於&
必須要的時候:
調用的是自己定義的子函數,而且調用發生在定義前面
自己定義了和系統函數重名的子函數,要調用它就必須用&,好和系統函數區分。
可以省的時候,一句話,只要編譯器不會覺得有歧義,就可以省。
sub division{
$_[0] / $_[1]; #第一個參數除以第二個參數
}
my $quotient = division 355, 113; #可以省略掉括號,這種省了括號的要注意下
1.11 關於非標量的返回值
Perl可以返回非標量,列表,如果最後一條語句是列表或者給一個列表賦值,當然返回的就是列表,如果直接用retrun後不接任何東西,則返回undef。