Perl中的一個非常有用的函數是split - 把字符串進行分割並把分割後的結果放入數組中。這個函數使用規則表達式(RE),如果未特定則工作在$_變量上。
split函數可以這樣使用:
$info = "Caine:Michael:Actor:14, Leafy Drive"; @personal = split(/:/, $info);其結果是:
@personal = ("Caine", "Michael", "Actor", "14, Leafy Drive");
如果我們已經把信息存放在$_變量中,那麼可以這樣:
@personal = split(/:/);
如果各個域被任何數量的冒號分隔,可以用RE代碼進行分割:
$_ = "Capes:Geoff::Shot putter:::Big Avenue"; @personal = split(/:+/);
其結果是
@personal = ("Capes", "Geoff", "Shot putter", "Big Avenue");
但是下面的代碼:
$_ = "Capes:Geoff::Shot putter:::Big Avenue"; @personal = split(/:/);
的結果是
@personal = ("Capes", "Geoff", "", "Shot putter", "", "", "Big Avenue");單詞可以被分割成字符,句子可以被分割成單詞,段落可以被分割成句子:
@chars = split(//, $word); @words = split(/ /, $sentence); @sentences = split(//./, $paragraph);
在第一句中,空字符串在每個字符間匹配,所以@chars數組是一個字符的數組。
關聯數組
順序表數組允許我們按照數字對其元素進行訪問。數組@food的第一個元素是$food[0],第二個元素是$food[1],等等。但是Perl也允許我們建立可以通過字符串進行訪問的數組,稱爲關聯數組(associative arrays)。
我們用括號定義關聯數組,但是數組名前有一個%符號。假設我們建立一個關於人和他們的年齡的數組,則可以這樣:
%ages = ("Michael Caine", 39, "Dirty Den", 34, "Angie", 27, "Willy", "21 in dog years", "The Queen Mother", 108);
現在我們可以這樣找到人們的年齡:
$ages{"Michael Caine"}; # Returns 39 $ages{"Dirty Den"}; # Returns 34 $ages{"Angie"}; # Returns 27 $ages{"Willy"}; # Returns "21 in dog years" $ages{"The Queen Mother"}; # Returns 108
訪問單個元素時用$,而不是% - 因爲單個元素是標量。關聯數組的索引包含在花括號內。
可以通過把關聯數組賦給一個表數組變量把關聯數組轉換爲表數組。表數組也可以轉換爲關聯數組 - 通過把它賦值給關聯數組變量。理想地,表數組將有偶數個元素:
@info = %ages; # @info is a list array. It # now has 10 elements $info[5]; # Returns the value 27 from # the list array @info %moreages = @info; # %moreages is an associative # array. It is the same as %ages
操作符
關聯數組的元素沒有順序(有點象hash表),但是可以通過keys函數和values函數輪流訪問所有的元素:
foreach $person (keys %ages) { print "I know the age of $person/n"; } foreach $age (values %ages) { print "Somebody is $age/n"; }
當keys被調用時,返回關聯數組的keys的列表。當values被調用時,返回數組的值的列表。這兩個函數返回的列表的順序相同,但是這個順序與元素被輸入的順序沒有關係。
當keys和values在一個標量環境中被調用時,它們返回關聯數組中的key/value對的數目。
有一個each函數返回一個關鍵字和其值的兩個元素的列表。每調用each一次,它返回另一個key/value對:
while (($person, $age) = each(%ages)) { print "$person is $age/n"; }
環境變量
當在UNIX中運行perl程序或任何script時,會遇到某些環境變量。比如,USER包含你的用戶名,DISPLAY確定圖形使用的屏幕。當在WWW中運行perl CGI script時,也有環境變量存儲其它有用的信息。所有這些變量和它們的值存儲在關聯數組%ENV中,其關鍵字爲變量名。可以試試這個perl程序:
print "You are called $ENV{'USER'} and you are "; print "using display $ENV{'DISPLAY'}/n";
子過程
和很多語言一樣,Perl允許用戶定義自己的函數,稱爲子過程(subroutine)。它們可以放在程序的任何地方,但是最好把它們全放在程序的頂部或尾部。
子過程的形式如下:
sub mysubroutine { print "Not a very interesting routine/n"; print "This does the same thing every time/n"; }
可以給子過程傳遞任何數量的參數。下面的語句都可以調用這個子過程。注意子過程在調用時在名稱前使用一個&字符:
&mysubroutine; # Call the subroutine &mysubroutine($_); # Call it with a parameter &mysubroutine(1+2, $_); # Call it with two parameters
參數
在上面的例子中參數被接受但是被忽略。當子過程被調用時,任何參數都被傳遞到特殊表數組變量@_中,這個變量與$_沒有任何關係。下面的子過程只是打印它被調用的參數的列表。後面是一些調用它的例子。
sub printargs { print "@_/n"; } &printargs("perly", "king"); # Example prints "perly king" &printargs("frog", "and", "toad"); # Prints "frog and toad"
和任何其它列表數組一樣,@_中的單個元素可以通過方括號訪問:
sub printfirsttwo { print "Your first argument was $_[0]/n"; print "and $_[1] was your second/n"; }
要注意的是標量$_[0]和$_[1]等與標量$_沒有任何關係。
返回值
子過程的結果總是最後被賦值。下面的子過程返回其兩個輸入參數中較大的,然後是一個調用這個子過程的例子。
sub maximum { if ($_[0] > $_[1]) { $_[0]; } else { $_[1]; } } $biggest = &maximum(37, 24); # Now $biggest is 37
上面的&printfirsttwo子過程也返回一個值,這時是1。這是因爲這個子過程所做的最後一件事是print語句,打印成功的結果總是1。
局部變量
@_變量對當前子過程是局部的,當然$_[0]、$_[1]、$_[2]等也是這樣。其它變量也可以被設置爲局部的,這在我們開始改變輸入參數時是有用的。下面的子過程判斷一個字符串是否在另一箇中,不包括空格。然後是一個引用它的例子。
sub inside { local($a, $b); # Make local variables ($a, $b) = ($_[0], $_[1]); # Assign values $a =~ s/ //g; # Strip spaces from $b =~ s/ //g; # local variables ($a =~ /$b/ || $b =~ /$a/); # Is $b inside $a # or $a inside $b? } &inside("lemon", "dole money"); # true
實際上,可以簡化爲
local($a, $b) = ($_[0], $_[1]);
Perl初級教程[第3天]<<