Perl语言入门学习笔记-12

上一篇 / 下一篇  2008-02-02 18:43:23 / 个人分类:编程吧

51Testing软件测试网 _(s-N ~J

#前段时间,由于种种原因,Perl的学习被搁浅了。利用年前这段比较空闲的时间,把以前的笔记重新温
gEE}(Uq O0#习并整理修正了一下。后面还有几章,争取尽快学完。51Testing软件测试网FD|kK)f#zI ^[

/~*NZ.Zq e0字符串处理与排序

1WU4QHTje(s-L6AB051Testing软件测试网,B!_*FHE5g

+用index寻找子字符串
X&`M5F'cc*B-h$@1eA0my $where=index($big, $small);
-z#f\ l[ k:I%S2A0在$big字符串里寻找$small字符串首次出现的位置(从0开始),返回值为整数,代表第一个字符出现的位置。如果无法找到,则返回-1。
"^.B#kR'B&p7[6R0#在某个字符串中重复搜索某个子字符串51Testing软件测试网?)Fa5cK:D$hU([$no
my $stuff="Howdy world!";51Testing软件测试网e1foq ^e:w
my $where1=index($stuff, "w");  #2
F|jh;^(}$f0my $where2=index($stuff, "w", $where1+1);  #6
-~UN~3A3_0my $where3=index($stuff, "w", $where2+2);  #-1
|5u5lR;U%nQ0第三个参数指明开始搜索的位置
;B"H.AUM]0my $last_slash=rindex("/etc/passwd", "/");  #451Testing软件测试网'h X1h)y-Or s [6N
rindex返回子字符串最后出现的位置(仍然是第一个字符出现的位置),实际上是从字符串尾端开始搜索并返回第一个找到的位置。
`9p E2l:q,wyk P0+用substr操作子字符串
,z'b c8{b0$part=substr($string, $initial_position, $length);51Testing软件测试网"L-k%KlB1R
省略第三个参数获第三个参数超长,一直取到字符串尾部。第二个参数为负数时,表示从字符串尾靠嫉故?BR>my $string="Hello, world!";51Testing软件测试网(F$U6P,|,Z5b5Zv
substr($string,0,5)="Goodbye";  #$string变为"Goodbye, world!"
8q-W?hCmJ+|5Q:g)_,]5d0substr($string,0,5,"Goodbye"); 51Testing软件测试网pnvhj?kf
#这是一个函数调用,第四个参数为替换后的子字符串,返回值为替换前的子字符串51Testing软件测试网;Q3kkcD
被替换的字符串的长度不一定要与替换的字符串的长度相同。51Testing软件测试网e0D6|n Dt[#m
substr($string,-20)=~s/fred/barney/g; 
v J'L3N5s3}h.v0#只处理字符串的最后20个字符,将所有的fred换成barney51Testing软件测试网%k6],k`&GIJK\+CVG
当然这些事情也可以让正则表达式去做,但是使用字符串处理的函数会更快一些。51Testing软件测试网-@N&]+[dnS
51Testing软件测试网'x!D-Bq!V3I
+用sprintf格式化数据51Testing软件测试网 f/e)O e&U*Hl&D
sprintf函数和printf函数有相同的参数(文件句柄除外),sprintf返回所要请求的字符串,而不输出。可将格式化的字符串存储在变量中。51Testing软件测试网 lQ_!iC6yUr
my $date_tag=sprintf
?sA isl0  "%4d/%02d/%02d %2d:%02d:%02d",51Testing软件测试网~-b+g*n,sv5J
  $year,$month,$date,$hour,$minute,$second;
D3@7Zb/p0#按照2038/01/19 3:00:08的格式输出日期
9j9Q] lE/G0R0在格式数值前置0,表示必要时在数值前面补0以符合要求的宽度,否则要在前面用空格补齐。51Testing软件测试网mvbzWY{
my $money=sprintf "%.2f", 2.49997  #小数点后保留2位,进行四舍五入
B1f,V@.fJ0#将货币数值转换格式,用逗号分隔,开头加上货币符号
0j{Cae}d0sub big_money {51Testing软件测试网iQjQ'ToQ
  my $number=sprintf "%.2f", shift @_;
n_5J/Flq0  1 while $number=~s/^(-?\d+)(\d\d\d)/$1,$2/;
f U wsG9B3m[#h v0  #这是个空循环,1什么也不做,只是个占位符(placeholder)。
:y(^.w|6`0  #真正的工作是执行条件表达式中的替换运算。51Testing软件测试网].mf,iv9WI
  #无法匹配并替换逗号和小数点以后的数字。51Testing软件测试网,V~k!])bC5l|iH
  #因为必须从小数点开始倒回处理,而不是从字符串开头进行处理,
W&B:pd1`0  #所以不直接用s///g进行全局查找和替换。
5M'H C&]xU-ia0  #-使程序可以处理负号开始的数值字符串。
&NC-`~T0  $number=~s/^(-?)/$1\$/;
`iO)]u,I0  #在正确的位置加上美元符号,不一定是第一个字符。
G ~0N Sgi$eg0  $number;51Testing软件测试网NXl_K3owV _v
}
&Em2lz[051Testing软件测试网3E t.R'UG
+高级排序
d~'h:v2wM G4v"s}Z0++列表排序
+kB2J4\8y!^0除了内置的sort操作符,以ASCII编码的顺序对列表进行排序外,还有哪些排序方法呢?51Testing软件测试网p-Mi3iT;` J.l[0J
首先定义排序子例程(sort definition subroutine),指定排序方式。一般比较两个元素。子例程返回一个数值,用来描述两个元素之间的顺序。Perl通过不断调用排序子例程,来对所有元素进行排序。
,B f(s@bg z,V$r0使用排序子例程时,将其名称(去掉&)放在sort关键字和要排序的列表之间。
j/{ny;e6ibYG0sub by_number {
?w+]cBZD0  #按照数值大小进行递增排序
WOgm.u&Q0  #不用对变量进行声明和赋值,my($a,$b)=@_51Testing软件测试网/}3Z ?$sJ3s"N tO(mp
  #变量会被Perl自动赋值。51Testing软件测试网%BEu h:s6nc
  #事实上,基于效率的考虑,变量$a、$b不是数据项的副本,
%@o~ A6o {0  #而是原始列表元素的暂用别名。51Testing软件测试网_ h&d/x:\I/j
  #不要试图去改变它们,否则会弄乱原始数据。
u?x zX:z@&f0  #否则在排序子例程被多次调用时,程序的运行会变慢
gW1K dp9l0  if ($a<$b) {-1} elsif ($a>$b) {1} else {0}51Testing软件测试网i!kQu Z:qy
}51Testing软件测试网(v.O6T!G$y y U:`
my @result=sort by_number @some_numbers;
m-G9x E8t~(K0my @result=sort { $a <=> $b } @some_numbers;  #更简单一点的51Testing软件测试网&~u?0U9t*l@5j
上面的子例程也可以简写成:51Testing软件测试网U+e_-q;O T_
sub by_number { $a <=> $b }51Testing软件测试网A;D p/h G S9E
数值比较操作符<=>表示会比较两个数值并返回-1、0或1。51Testing软件测试网,Z)ej D\,u2_-m`
字符串比较操作符cmp表示比较两个字符串,排序方式与sort的默认排序方式相同。
D c}6j-X:hlNh'w%O0sub case_insensitive { "\L$a" cmp "\L$b" }  #不区分大小写的排序51Testing软件测试网"QD)C)e:U:l/iRA}
my @descending=reverse sort { $a <=> $b } @some_numbers;  #递减排序
WR n j t2S!J.bzk0my @descending=sort { $b <=> $a } @some_numbers;  #另一种写法51Testing软件测试网td+x ~8gr-W:RZ c)`
++散列排序
r@5V:gz8X1M j0根据散列元素的值排列散列键51Testing软件测试网8L^]nZix4c-n
my %score=("barney"=>195,"fred"=>205,"dino"=>30);51Testing软件测试网%dpa!|~ I&e
my @winners=sort { $score{$b} <=> $score{$a} } keys %score;
%p{Q9eteg}0#如果有多个玩家的分数相同,怎么排序呢?51Testing软件测试网!hEC"q,pS3b,h|
#将他们的名字按照ASCII码顺序排在一起51Testing软件测试网 nv%s$VUs
my @winners=sort by_score_and_name keys %score;51Testing软件测试网?1Z-W%xeoY
sub by_score_and_name {
#`SnT.MD"eA|i0  $score{$b} <=> $score{$a}
]%w3q B"z D0    or51Testing软件测试网Z5?9]6B-Fr@
  $a cmp $b
-{#Qk;k|Cd)A0}

g\m:}`K} j!O4jn0

TAG: 编程吧

 

评分:0

我来说两句

日历

« 2024-04-29  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 22454
  • 日志数: 38
  • 文件数: 1
  • 书签数: 3
  • 建立时间: 2007-08-14
  • 更新时间: 2008-05-01

RSS订阅

Open Toolbar