Perl字符串和排序用法详解

本文和大家重点讨论一下Perl字符转和排序的概念,Perl字符串中选择的相应位置是可以改变的,而Perl排序子程序返回一个值,表明这两个元素如何比较的。如果在最终结果中$a出现在$b之前,则其排序子程序返回-1。如果$b出现在$a之前,则返回1。如果$a和$b的顺序无关紧要,则子程序返回0。

Perl字符串和排序

1、使用索引寻找子串

Perl语言中查找的方法依赖于查找的地方。如果在一个大字符串中查找,那很幸运的,index函数可以帮你的忙。字符位置是从0开始编号的。

$where=index($big,$small);查找子串第一次在大字符串中出现的地方,返回第一个字符的位置,如果子串不存在,则返回-1。可以将位置数(positionnumber)想象成找到此子串所经过的字符。

my$where2=index($stuff,“w”,$where+1);#$where得到6,第三个参数给出了返回值的极小值。

你可能想知道某个子串最后出现的位置。可以使用rindex函数来做到,返回距离字符串头的位置。

2、Perl语言中substr操作子串

substr只处理部分的字符串。$part=substr($string,$initial_position,$length);

一个字符串,一个从0开始编号的初始位置,以及子串的长度。返回值是一个子串。

如果请求的长度超过了字符串的长度,得到的是一个比你所希望的更短的结果。如果想明确要求到达字符串的结尾处,无论其或长或短,可以省略掉第三个参数。

初始位置可以是负的,表示从字符串结尾处开始(此时,-1表示最后一个字符)

字符串中选择的相应位置是可以改变的:

my$string=“Hello,world!”;
substr($string,0,5)=“Goodbye”;#$string现在变成了“Goodbye,world!”

substr($string,-20)=~s/fred/barney/g;
susbtr:使用4个参数,第四个参数是替换的字符串:

my$previous_value=substr($string,0,5,“Goodbye”);

3、Perl语言中sprintf

sprintf函数的参数和printf的参数完全相同(除了可选的文件句柄外),但它返回的是被请求的字符串,而非打印出来。这对于希望将某个格式的字符串存入变量以供将来使用的情况非常方便。

my$data_tag=sprintf“%4d/%02d/%02d%02d:%02d:%02d”,$yr,$mo,$da,$h,$m,$s;

$date_tag得到像“2038/01/193:00:08”这样的值。格式化数字中的前置0的含义是,如果需要,在前面加上0,使之达到需要的宽度。

4、subbig_money

{
my$number=sprintf“%.2f”,shift@_;
1while$number=~s/^(-?\d+)(\d\d\d)/$1,$2/;#在do-nothing循环中,每一次加入一个逗号
$number=~s/^(-?)/$1\$/;#将美元符号放入合适的位置
$number;
}

5、Perl语言中高级排序

排序子程序返回一个值,表明这两个元素如何比较的。如果在最终结果中$a出现在$b之前,则其排序子程序返回-1。如果$b出现在$a之前,则返回1。如果$a和$b的顺序无关紧要,则子程序返回0。

subby_number{
if($a<$b){-1}elsif($a>$b){1}else{0}
}

要使用一个排序子程序,将它(不使用&)放在关键字sort和你要排序的列表之间。

my@result=sortby_number@some_numbers;许多的排序子程序的名字都由by_开头,来描述如何排序

我们不需要在排序子程序中申明$a和$b,以及给它们设置。如果做了,子程序将不能得到正确结果。我们让Perl为我们给$a和$b赋值,我们只需要写如何比较。

三向的比较数字操作符:太空船(spaceship)符号(<=>)。这个操作符比较两个数字,按照数字将其排序,并返回-1,0,1。subby_number{$a<=>$b}

字符串的三向操作符:cmp

subcase_insenstive{“\L$a”cmp“\L$b”}大小写无关的排序

当你的排序子程序像我们这里的那样简单时,你可以通过使用“inline”子程序来代替排序的名字,使之更简单,如:my@numbers=sort{$a<=>$b}@some_numbers;在当代的Perl程序中,几乎见不到独立的排序子程序。

my@descending=reversesort{$a<=>$b}@some_numbers;按照数字的降序方式排序

my@descending=sort{$b<=>$a}@some_nubmers;按照数字的降序方式排序

6、hashes中使用sort时,只是对hash的keys排序(按照字母表顺序排序)。现在我们将对hash的keys排序,其顺序由其对应的hash中的值决定。

subby_socre{$score{$b}<=>$score{$a}}

相关推荐