Perl字符串和排序用法詳解
本文和大家重點(diǎn)討論一下Perl字符轉(zhuǎn)和排序的概念,Perl字符串中選擇的相應(yīng)位置是可以改變的,而Perl排序子程序返回一個(gè)值,表明這兩個(gè)元素如何比較的。如果在最終結(jié)果中$a出現(xiàn)在$b之前,則其排序子程序返回-1。如果$b出現(xiàn)在$a之前,則返回1。如果$a和$b的順序無關(guān)緊要,則子程序返回0。
Perl字符串和排序
1、使用索引尋找子串
Perl語言中查找的方法依賴于查找的地方。如果在一個(gè)大字符串中查找,那很幸運(yùn)的,index函數(shù)可以幫你的忙。字符位置是從0開始編號的。
$where=index($big,$small);查找子串***次在大字符串中出現(xiàn)的地方,返回***個(gè)字符的位置,如果子串不存在,則返回-1??梢詫⑽恢脭?shù)(positionnumber)想象成找到此子串所經(jīng)過的字符。
my$where2=index($stuff,“w”,$where+1);#$where得到6,第三個(gè)參數(shù)給出了返回值的極小值。
你可能想知道某個(gè)子串***出現(xiàn)的位置??梢允褂胷index函數(shù)來做到,返回距離字符串頭的位置。
2、Perl語言中substr操作子串
substr只處理部分的字符串。$part=substr($string,$initial_position,$length);
一個(gè)字符串,一個(gè)從0開始編號的初始位置,以及子串的長度。返回值是一個(gè)子串。
如果請求的長度超過了字符串的長度,得到的是一個(gè)比你所希望的更短的結(jié)果。如果想明確要求到達(dá)字符串的結(jié)尾處,無論其或長或短,可以省略掉第三個(gè)參數(shù)。
初始位置可以是負(fù)的,表示從字符串結(jié)尾處開始(此時(shí),-1表示***一個(gè)字符)
字符串中選擇的相應(yīng)位置是可以改變的:
my$string=“Hello,world!”;
substr($string,0,5)=“Goodbye”;#$string現(xiàn)在變成了“Goodbye,world!”
substr($string,-20)=~s/fred/barney/g;
susbtr:使用4個(gè)參數(shù),第四個(gè)參數(shù)是替換的字符串:
my$previous_value=substr($string,0,5,“Goodbye”);
3、Perl語言中sprintf
sprintf函數(shù)的參數(shù)和printf的參數(shù)完全相同(除了可選的文件句柄外),但它返回的是被請求的字符串,而非打印出來。這對于希望將某個(gè)格式的字符串存入變量以供將來使用的情況非常方便。
my$data_tag=sprintf“%4d/%02d/%02d%02d:%02d:%02d”,$yr,$mo,$da,$h,$m,$s;
$date_tag得到像“2038/01/193:00:08”這樣的值。格式化數(shù)字中的前置0的含義是,如果需要,在前面加上0,使之達(dá)到需要的寬度。
4、subbig_money
{
my$number=sprintf“%.2f”,shift@_;
1while$number=~s/^(-?\d+)(\d\d\d)/$1,$2/;#在do-nothing循環(huán)中,每一次加入一個(gè)逗號
$number=~s/^(-?)/$1\$/;#將美元符號放入合適的位置
$number;
}
5、Perl語言中高級排序
排序子程序返回一個(gè)值,表明這兩個(gè)元素如何比較的。如果在最終結(jié)果中$a出現(xiàn)在$b之前,則其排序子程序返回-1。如果$b出現(xiàn)在$a之前,則返回1。如果$a和$b的順序無關(guān)緊要,則子程序返回0。
subby_number{
if($a<$b){-1}elsif($a>$b){1}else{0}
}
要使用一個(gè)排序子程序,將它(不使用&)放在關(guān)鍵字sort和你要排序的列表之間。
my@result=sortby_number@some_numbers;許多的排序子程序的名字都由by_開頭,來描述如何排序
我們不需要在排序子程序中申明$a和$b,以及給它們設(shè)置。如果做了,子程序?qū)⒉荒艿玫秸_結(jié)果。我們讓Perl為我們給$a和$b賦值,我們只需要寫如何比較。
三向的比較數(shù)字操作符:太空船(spaceship)符號(<=>)。這個(gè)操作符比較兩個(gè)數(shù)字,按照數(shù)字將其排序,并返回-1,0,1。subby_number{$a<=>$b}
字符串的三向操作符:cmp
subcase_insenstive{“\L$a”cmp“\L$b”}大小寫無關(guān)的排序
當(dāng)你的排序子程序像我們這里的那樣簡單時(shí),你可以通過使用“inline”子程序來代替排序的名字,使之更簡單,如:my@numbers=sort{$a<=>$b}@some_numbers;在當(dāng)代的Perl程序中,幾乎見不到獨(dú)立的排序子程序。
my@descending=reversesort{$a<=>$b}@some_numbers;按照數(shù)字的降序方式排序
my@descending=sort{$b<=>$a}@some_nubmers;按照數(shù)字的降序方式排序
6、hashes中使用sort時(shí),只是對hash的keys排序(按照字母表順序排序)。現(xiàn)在我們將對hash的keys排序,其順序由其對應(yīng)的hash中的值決定。
subby_socre{$score{$b}<=>$score{$a}}
my%score=(“barney”=>,“fred”=>205,“dino”=>30);
my@winners=sortby_scorekeys%score;
subby_score_and_name{
$score{$b}<=>$score{$a}#按照降序的成績
or
$acmp$b;#字母順序的名字
}Perl語言中排序子程序可以有多級。
【編輯推薦】
- 暢談Perl操作符用法
- Perl文件句柄概念詳解
- Perl二維數(shù)組用法全程剖析
- 暢談Perl操作符用法
- 學(xué)習(xí)筆記 Perl數(shù)字與字符串間的自動(dòng)轉(zhuǎn)換