Perl初级教程[第4天]
2005-01-12 14:53
211 查看
Split
Perl中的一个非常有用的函数是split - 把字符串进行分割并把分割后的结果放入数组中。这个函数使用规则表达式(RE),如果未特定则工作在$_变量上。
split函数可以这样使用:
如果我们已经把信息存放在$_变量中,那么可以这样:
@personal = split(/:/);
如果各个域被任何数量的冒号分隔,可以用RE代码进行分割:
其结果是
@personal = ("Capes", "Geoff", "Shot putter", "Big Avenue");
但是下面的代码:
的结果是
@personal = ("Capes", "Geoff", "", "Shot putter", "", "", "Big Avenue");
单词可以被分割成字符,句子可以被分割成单词,段落可以被分割成句子:
在第一句中,空字符串在每个字符间匹配,所以@chars数组是一个字符的数组。
关联数组
顺序表数组允许我们按照数字对其元素进行访问。数组@food的第一个元素是$food[0],第二个元素是$food[1],等等。但是Perl也允许我们建立可以通过字符串进行访问的数组,称为关联数组(associative arrays)。
我们用括号定义关联数组,但是数组名前有一个%符号。假设我们建立一个关于人和他们的年龄的数组,则可以这样:
现在我们可以这样找到人们的年龄:
访问单个元素时用$,而不是% - 因为单个元素是标量。关联数组的索引包含在花括号内。
可以通过把关联数组赋给一个表数组变量把关联数组转换为表数组。表数组也可以转换为关联数组 - 通过把它赋值给关联数组变量。理想地,表数组将有偶数个元素:
操作符
关联数组的元素没有顺序(有点象hash表),但是可以通过keys函数和values函数轮流访问所有的元素:
当keys被调用时,返回关联数组的keys的列表。当values被调用时,返回数组的值的列表。这两个函数返回的列表的顺序相同,但是这个顺序与元素被输入的顺序没有关系。
当keys和values在一个标量环境中被调用时,它们返回关联数组中的key/value对的数目。
有一个each函数返回一个关键字和其值的两个元素的列表。每调用each一次,它返回另一个key/value对:
环境变量
当在UNIX中运行perl程序或任何script时,会遇到某些环境变量。比如,USER包含你的用户名,DISPLAY确定图形使用的屏幕。当在WWW中运行perl CGI script时,也有环境变量存储其它有用的信息。所有这些变量和它们的值存储在关联数组%ENV中,其关键字为变量名。可以试试这个perl程序:
子过程
和很多语言一样,Perl允许用户定义自己的函数,称为子过程(subroutine)。它们可以放在程序的任何地方,但是最好把它们全放在程序的顶部或尾部。
子过程的形式如下:
可以给子过程传递任何数量的参数。下面的语句都可以调用这个子过程。注意子过程在调用时在名称前使用一个&字符:
参数
在上面的例子中参数被接受但是被忽略。当子过程被调用时,任何参数都被传递到特殊表数组变量@_中,这个变量与$_没有任何关系。下面的子过程只是打印它被调用的参数的列表。后面是一些调用它的例子。
和任何其它列表数组一样,@_中的单个元素可以通过方括号访问:
要注意的是标量$_[0]和$_[1]等与标量$_没有任何关系。
返回值
子过程的结果总是最后被赋值。下面的子过程返回其两个输入参数中较大的,然后是一个调用这个子过程的例子。
上面的&printfirsttwo子过程也返回一个值,这时是1。这是因为这个子过程所做的最后一件事是print语句,打印成功的结果总是1。
局部变量
@_变量对当前子过程是局部的,当然$_[0]、$_[1]、$_[2]等也是这样。其它变量也可以被设置为局部的,这在我们开始改变输入参数时是有用的。下面的子过程判断一个字符串是否在另一个中,不包括空格。然后是一个引用它的例子。
实际上,可以简化为
local($a, $b) = ($_[0], $_[1]);
Perl初级教程[第3天]<<
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天]<<
相关文章推荐
- [转 - 改] Perl初级教程 (三)
- [转 - 改] Perl初级教程 (四)
- 有关perl的一个比较好的初级教程
- [转 - 改] Perl初级教程 (三)
- Perl初级教程[第1天]
- [转 - 改] Perl初级教程 (一)
- Perl初级教程[第2天]
- Perl初级教程[第3天]
- [转 - 改] Perl初级教程 (四)
- Perl初级教程 (5) 遍历文件夹内指定扩展名文件,查找匹配关键字的输出。
- Perl初级教程 (5) 遍历文件夹内指定扩展名文件,查找匹配关键字的输出。
- [转 - 改] Perl初级教程 (二)
- [转 - 改] Perl初级教程 (一)
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)
- Android初级教程:单击事件的传递机制初谈
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 小程序初级教程
- [置顶] sqlmap 使用测试初级教程(实际已测试 -版本1.0)
- C# 2.0中泛型编程初级入门教程