Perl学习之字符串和排序

Perl被设计成90%擅长处理文本,10%处理其余的问题。因此Perl有强大的文本处理能力,包括正则表达式。但有时正则表达式过于复杂,需要一种更简单的方法来处理字符串。

一、使用索引寻找子串

查找的方法依赖于查找的地方。如果在一个大字符串中查找,可以使用index函数。

Perl查找子串第一次在大字符串中出现的地方,返回第一个字符的位置。字符位置是从0开始编号的。如果子串在字符串的开头处找到,则index返回0。如果一个字符后,则返回1,依次类推。如果子串不存在,则返回-1。


my $text = "hello world!";
my $where = index($text, "wor");
print $where;#本例输出6

index函数总是报告子串出现的第一个位置。可以使用可选的第三个参数要求它从后面的某个地方开始查询,它会告诉index从什么位置开始。

NOTE:通常不能重复的查找某个子串,除非使用了循环。

如果想知道某个子串最后出现的位置。可以使用rindex 函数来做到。


my $text = "hello world!";
my $where = rindex($text, "l");
print $where;#本例输出9

rindex函数也有可选的第三个参数,它给出的是可能的最大值。

二、使用substr 操作子串

substr只处理部分的字符串,它有三个参数:一个字符串,一个从0 开始编号的初始位置,以及子串的长度。返回值是一个子串。


my $text = "hello world!";
my $where = substr($text, 2,7);
print $where;#本例输出 llo wor

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

index和substr可以很好的一起工作。


my $text = "hello world!";
my $where = substr($text, index($text,"o"));
print $where;#本例输出 o world

如果字符串为变量,字符串中选择的相应位置是可以改变的。


my $text = "hello, world!";
substr($text,0,5) = "goodbye";
print $text;#输出 goodbye, world!

NOTE:赋值的串长度不需要和它替换的子串长度相同,字符串会自动调整到合适的长度。

substr的第四个参数也可完成与上例相同的工作。


my $text = "hello, world!";
substr($text,0,5,"goodbye");
print $text;#输出 goodbye, world!

三、使用sprintf格式化数据

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

在货币数字中使用sprintf

一种常用sprint 的地方是,你需要给定数字的小数点后面几位,例如需要将某个金钱数量显示为2.50而非2.5也不是2.49997!这使用 %.2f 很容易做到:


my $money = sprintf "%.2f", 2.49997;
print $money;

四、高级排序

1.依据值对Hash进行排序

根据value对hash排序,如下例:


sub test
{
	$score{$b} <=> $score{$a}
}

my %score = (”barney”=>54, “fred”=>205, “dino”=> 30);
my @winners = sort test keys %score;

foreach $v (@winners)
{
	print $v.”\n”;
}

2.对多个keys排序

当出现value一样时.可能按照key再进行排序:


sub test
{
	$score{$b} <=> $score{$a} #按照降序的成绩
	or
	$a cmp $b; #字母顺序的名字
}

my %score = (”barney”=>54, “fred”=>205, “well”=>205, “dino”=>30);
my @winners = sort test keys %score;

print @winners;

银子曰:有事早奏!无事退朝!

发表评论

验证码: 验证码看不清发泄点这里

 

浏览最多的10篇日志

评论最多的10篇日志

随机显示的10篇日志