第十三章  字符串与排序
 
1、  index 函数用来在一个字符串中查找某个子串首次出现的位置并以整数形式(从零算起)返回,如果无法找到指定的子串,则返回0;其第一个参数是原字符串,第二个参数是要查找的子串,第三个参数则可用来指定开始查找的位置(默认从串首部开始查找);如果指定了第三个参数后,无法找到指定的字符串,返回值为-1rindex 函数可用来查找子串最后出现的位置;
2、  substr 可 以用来返回某字符串中从某个指定起始位置开始的指定长度的子串;其第一个参数是原字符串,第二个参数是超始位置,第三个参数是子串长度;如果省略第三个参 数,则返回从指定位置直到字符串尾的子串;如果指定长度超出从起始位置至字符串结束的总长度,会仅返回从起始位置至串尾的子串;起始位置可以为负值,表示 从串尾开始倒数,例如最后一个字符的位置是-1;如果字符串是个变量,则可以使用substr来更换指定的部分,如:
my $string = “How are you?”;
substr($string, 0 , 3) = “Where”;  #$string 变成了“Where are you?
被取代的部分不一定非得和取代部分等长,字符串会自行调整;取代部分也可以作为substr函数的第四个参数使用,如:substr($string, 0 ,3 , “Where”)
3、  srpintf 函数除了可以类似于printf格式化字符串外,还可以将结果返回,而不是输出,因此,可以将返回结果保存至变量;
4、  排序必须两两进行,如在$a$b之间进行比较,此时,假如排序结果中$a 应该在$b 之前,返回值为-1,如果$b 应该在$a 之前,返回值为1,顺序相同,则返回值为0;而此功能在Perl中可以通过建立子例程实现,更简单的方法是使用<=>(用以排序数值)操作符和cmp(用以排序字符串) 操作符来实现;cmp可以用来建立更复杂的排序,如不区分大小写的排序:
     Sub case_insensitive { “\L$a” cmp “\L$b” }
   排序中,基于效率的理由,$a$b并不是数据项的副本,而是原始数据本身;排序时建议最好不要改变元素本身,因为这样会弄乱原始数据;
5、  排序散列时,只能对散列键排序,基准可以是散列键的ASCII码,也可以是散列键对应的值,甚至可以在对应值相同时再以键本身的ASCII排序,即以多个键进行排序;如:
     my @winners = sort by_score_and_name keys %score;
     sub by_score_and_name {
       $score{$b} <=> $score{$a}    #递减排序
           or
       $a  cmp  $b
}
$socre{$b}$score{$a}相同时,则依$a$bASCII码进行排序;