Perl初級教程[第4天]

Split

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天]<<

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章