Perl语言入门——字符串与排序

在字符串内用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码排列
    }
当然也可以进行更多级的排序

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值