众所周知Perl处理字符串的功能非常强大,Perl(Practical Extraction and Reporting language)处理格式的功能也非常强大,这里我们就开始学习一些Perl的格式和字符串处理。

熟悉其最强大的三个函数:substr、pack、unpack。

1、大小写处理函数 lc(转为小写) uc(转为大写) 。 

 $text="zhengwen feng"; 

 $text2=lc $text; 

 $text3=uc $text; 

 print "$text2\n"; 

 print "$text3\n"; 


 2、将第一字母变为小写(lcfirst),将第一个字母大写(ucfirst)。 

 $string="zheng"; 

 $string2=lcfirst $string; 

 $string3=ucfirst $string; 

 print "$string2\n"; 

 print "$string3\n"; 


 3、顺序查找string位置(index),逆序查找string位置(rindex)。index在字串中找尋某一子字串的起始位置。 

 $string="zheng wen feng zheng wen feng"; 

 $position1=index($string,"wen"); 

 $position2=index($string,"wen",10); 

 $position3=rindex($string,"zheng"); 

 $position4=rindex($string,"zheng",10); 

 print "$position1,$position2,$position3,$position4\n"; 


 #!/usr/bin/Perl 

 $str="ABCDEFG1234567"; 

 $a="12"; 

 $pos=index($str,$a); 

 print$pos,"\n"; 


 [hto@localhost]$./tipind.pl 

 7 


 4、获取子串函数substr,功能非常强大,可以直接支持以一个字符串代替字符串的一个子串。 

 $text="zheng wenfeng 爱 KittyKitty"; 

 $replace_to="爱"; 

 $replace_with="喜欢"; 

 substr($text,index($text,$replace_to),length($replace_to),$replace_with); 

 print "$text\n"; 


 5、字符串中取串长(字符数量)-length 

 #!/usr/bin/Perl 

 $str="abCD99e"; 

 $strlen=length($str); 

 print$strlen,"\n"; 

 [htog@localhost]$./tiplen.pl 

 7 


 8、pack和unpack函数用于字符串的打包和解包,功能非常强大,支持多种打包格式字符串处理的。 

 $decimal=17; 

 $newdecimal=unpack("B32",pack("N",$decimal)); 

 print "$newdecimal\n"; 

 $string="张大华爱中国"; 

 @array1=unpack("c*",$string); 

 @array2=unpack("C*",$string); 

 print (join(",",@array1),"\n"); 

 print (join(",",@array2),"\n"); 

 $string1=pack("c*",@array1); 

 $string2=pack("C*",@array2); 

 print "$string1\n"; 

 print "$string2\n"; 


 9、打印格式-sprintf 

 $value=1234.56789; 

 print sprintf "%.4f\n",$value; 


 10、字符串比较函数 eq、ne、cmp、lt、gt、le、ge,使用cmp就好。绝不能用'==',要用eq,正确的做法是:不论整形Perl字符串,都用eq。 

 $string1="大华"; 

 $string2="大华"; 

 if($string1 eq $string2){ 

 print "$sting1==$string2\n"; 

 } 

 if($string1 ne $string2){ 

 print "$string1!=$string2\n"; 

 } 


 if( ($string1 cmp $string2)==0){ 

 print "$string1==$string2\n"; 

 } 


 $string1="zheng"; 

 $string2="Kitty"; 

 if($string1 lt $string2){ 

 print "left < right \n"; 

 } 


 if($string1 gt $string2){ 

 print "left > right \n"; 

 } 


 if($string1 le $string2){ 

 print "left < right \n"; 

 } 


 if($string1 ge $string2){ 

 print "left > right \n"; 

 } 


 11、字符分割操作-split 

 @数组=split(pattern,串),将Perl字符串用某模式分成多个单词。 

 #!/usr/bin/Perl 

 $str="ABCDEiFG12i34567"; 

 @array=split(//,$str);按空格分 

 foreach(@array){ 

 print$_,"\n"; 

 } 


 [hto@localhost]$./tip.pl 

 ABCDEi 

 FG12i 

 345 

 6 

 7 


 @array=split(/+/,$line);当一行中各单词间的空格多于一个时。 


 空格和TAB混杂情况下的split 

 [hto@localhost]$vitip.pl 


 #!/usr/bin/Perl 

 $str="ABCDEiFG12i34567"; 

 @array=split(/\t/,$str); 

 foreach(@array){ 

 print$_,"\n"; 

 } 


 [hto@localhost]$./tip.pl 

 ABCDEiFG12i 

 34567 


 只分了两份,为什么?因为同时满足TAB和空格的只有一处,所以必须加[]。 

 @array=split(/[\t]/,$str);现在才是真正的按空格和TAB分 


 [hto@localhost]$./tip.pl 

 ABCDEi 

 FG12i 


 345 

 6 

 7 


 但还是有缺陷,TAB和空格相连时,TAB被认为是空格划分的子串,或者空格被认为是TAB划分的子串。 


 $string="张大华爱中国"; 

 @array=split(//,$string);#这种方法无法将其进行分成"张","大","华","爱","中","国"等单字 

 print (join(",",@array),"\n"); 


 12、演示中文字符夹带英文字符的反序(使用了多个函数) 

 print "------begin-----\n"; 

 $string1="中国love!张大华"; 

 @array=unpack("C*",$string1); 

 $length=$#array;#此数组的最后一个下标 

 for(;$length>=0;){ 

 if($array[$length]<=128){ 

 #英文或者标点 

 push(@array2,$array[$length]); 

 $length=$length-1; 

 } 

 else{ 

 #中文字符 

 push(@array2,$array[$length-1]); 

 push(@array2,$array[$length]); 

 $length=$length-2; 

 } 

 } 


 $string2=pack("C*",@array2); 

 print "$string2\n"; 

 $dir=dir; 

 print qx/$dir/; 

 @name=qw/zheng wen feng Kitty Kitty/; 

 print join(",",@name); 


 13、字符合并操作-join 

 用join定义Perl字符串数组格式符号(缺省)必须与qw()合用。 

 语法:join($string,@array) 

 @array=qw(onetwothree); 

 $total="one,two,three"; 

 @array=qw(onetwothree); 

 $total=join(":",@array); 

 $total="one:two:three"; 


 14、匹配数组内元素字串-grep 

 @array=("one","on","in"); 

 $count=grep(/on/,@array); 

 查询结果赋值给单变量 

 @array=("one","on","in"); 

 @result=grep(/on/,@array); 

 查询结果赋值给数组 

 2 

 one 

 on 


 15、字符串连接-'.=' 

 关于perl字符串连接的方法讨论。 

 $line = $line."456"; 

 这个语句中,line要被计算两次。 

 $line .= "456" ; 

 运算符',',常用于输出: 

 print "金",$v1; 

 print $str,"\n\n"; 


 '.'运算符和','类似,也是Perl字符串相加但通常只用于print而'.'可以用在任何Perl字符串相加的地方。 

 print '12345大家來'."helloworld"; 

 結果变成:12345大家來helloworld 


 16、重复连接运算符号-x 

 print"OK"x4; 

 結果变成: 

 OKOKOKOK 

 这个计算一次就可以了。Perl字符串的连接可以连接整形和字符形,整形也被当作字符型处理,没有printf里的%d问题。 


 17、双引号字符串中的转义符 

 符号    含义 

 \n    换行 

 \r    回车 

 \t    制表符 

 \f    formfeed 

 \b    退格 

 \a    响铃 

 \e    escape(ASCII中的escape字符) 

 \007    任何八进制值(这里是,007=bell(响铃)) 

 \x7f    任何十进制值(这里是,007=bell) 

 \cC    一个控制符(这里是,ctrl+c) 

 \\    反斜线 

 \"    双引号 

 \l    下个字符小写 

 \L    接着的字符均为小写直到\E 

 \u    下个字符大写 

 \U    接着的字符均为大写直到\E 

 \Q    在non-word字符前加上\,直到\E 

 \E    结束\L,\E和\Q