在字符串内用index搜索:用法为$where =index($big,$small);
perl会在$big字符串里寻找$small字符串首次出现的地方,并返回一个整数代表第一个匹配字符的位置(从零算起),如果无法找到,则返回-1
可以再加上可选的第三个参数来指定开始搜索的地方
my $where1=index("Howdy world!","w");
my $where2=index("Howdy world!","w",$where1+1);
偶尔会需要搜索字符串最后出现的位置,可以用rindex函数计算,用法同index
rindex也有可选的第三个参数,用来限定返回的最大位置
用substr处理子串:substr操作符只处理较长字符串中的一部分,用法如下
$part=substr($string,$initial_position,$length);
三个参数是字符串,从零算起的起始位置,子串的长度
my $rock = substr "Fred J. Flintstone",8,5;#值为Flint
假如字串的长度超出字符串的结尾,perl不会抱怨,只是得到比预期长度短的字符串
如果要一直取到字符串结尾,只要省略第三个参数即可
起始位置为负值,表示从字符串结尾开始倒数
假如字符串是个变量,可以修改该字符串被选取的部分,如
my $string="Hello, world!";
substr($string,0,5)="Goodbye"; #string现在的值为"Goodbye, world!"
还可以用绑定操作符只对字符串的某部分进行操作,下面例子处理最后20个字符
substr($string,-20)=~ s/fred/barney/g;
substr还有第四个参数,替换字串
my $previous_value=substr($string,0,5,"Goodbye");
注意此时得到的是替换前的子串
用sprintf格式化数据:与printf有相同的参数,但它返回处理过的字符串,而不会打印出来
my $data_tag=sprintf "...",...;
sprintf格式化的财务数据:sprintf的一种常见用法就是用来格式化小数点后具有特定精度的数值
如将2.4999显示成2.50而不是2.5,可以使用"%.2f"
my $money = sprintf "%.2f",2.4999;
如果手头有一个财务数据非常大,需要使用逗号分隔来有效阅读,可使用下面程序
sub big_moeny{
my $number=sprintf "%.2f",shift@_;
#下面的循环中,每次在匹配到的合适位置加上一个逗号
1 while $number=~ s/^(-?\d+)(\d\d\d)/$1,$2/;
#在正确的位置补上美元符号
$number=~ s/^(-?)/$1\$/;
$number;
}
高级排序:perl允许你建立自己的排序规则子程序,来实现想要的排序方式
排序子程序并不需要比较许多元素,只要能比较两个元素就行
子程序会返回一个数值,用来描述两个元素之间的顺序,如下是一个排序子程序
sub by_number{
#排序子程序,使用$a和$b这两个变量进行比较
if($a<$b){-1}elsif($a>$b){1}else{0}
}
要使用排序子程序,把名字(不带&)写在sort关键字与待排序列表之间,如下
my @result = sort by_number @some_numbers;
因为常常用到这样的三路比较,perl提供了一个方便的简写,飞碟操作符<=>,比较两个数字并返回1、-1、0
之前的排序子程序可以写成sub by_number{$a <=> $b};
飞碟操作符只能用来比较数值,相应的三路字符比较操作符是cmp,顺序与sort默认的顺序相同
cmp可以用来建立更复杂的排序顺序,例如不区分大小写的排序
sub case_insensitive{"\L$a" cmp "\L$b"}
事实上,几乎不会有人写额外的排序子程序,而是内嵌的排序子程序,如下
my @numbers= sort {$a <=> $b} @some_numbers;
假设要以递减的顺序进行排序,可使用reverse函数
my @descending= reverse sort {$a <=> $b} @some_numbers;
也可以把$a和$b对调实现反向排序
my @descending= sort {$b <=> $a} @some_numbers;
哈希按值排序:my %score=("barney"=>195,"fred"=>205,"dino"=>30);
my @winners=sort by_score keys %score;
sub by_score{$score{$b} <=> $score{$a}}
按多值排序:my @winners=sort by_score_and_name keys %score;
sub by_score_and_name{
$score{$b} <=> $score{$a} #根据分数降序排列
or
$a cmp $b #分数相同的再按名字的ASCII码排列
}
当然也可以进行更多级的排序