本文和大家重點(diǎn)討論一下Perl split函數(shù)的用法,Perl中的一個(gè)非常有用的函數(shù)是Perl split函數(shù)-把字符串進(jìn)行分割并把分割后的結(jié)果放入數(shù)組中。這個(gè)Perl split函數(shù)使用規(guī)則表達(dá)式(RE),如果未特定則工作在$_變量上。
Perl split函數(shù)
Perl中的一個(gè)非常有用的函數(shù)是Perl split函數(shù)-把字符串進(jìn)行分割并把分割后的結(jié)果放入數(shù)組中。這個(gè)Perl split函數(shù)使用規(guī)則表達(dá)式(RE),如果未特定則工作在$_變量上。
Perl split函數(shù)可以這樣使用:
復(fù)制代碼 代碼如下:
$info="Caine:Michael:Actor:14,LeafyDrive";
@personal=split(/:/,$info);
其結(jié)果是:@personal=("Caine","Michael","Actor","14,LeafyDrive");
◆如果我們已經(jīng)把信息存放在$_變量中,那么可以這樣:
復(fù)制代碼 代碼如下:
@personal=split(/:/);
如果各個(gè)域被任何數(shù)量的冒號(hào)分隔,可以用RE代碼進(jìn)行分割:
復(fù)制代碼 代碼如下:
$_="Capes:Geoff::Shotputter:::BigAvenue";
@personal=split(/:+/);
其結(jié)果是:@personal=("Capes","Geoff","Shotputter","BigAvenue");
但是下面的代碼:
復(fù)制代碼 代碼如下:
$_="Capes:Geoff::Shotputter:::BigAvenue";
@personal=split(/:/);
的結(jié)果是:@personal=("Capes","Geoff","","Shotputter","","","BigAvenue");
◆這個(gè)Perl split函數(shù)中單詞可以被分割成字符,句子可以被分割成單詞,段落可以被分割成句子:
復(fù)制代碼 代碼如下:
@chars=split(//,$word);
@words=split(//,$sentence);
@sentences=split(/\./,$paragraph);
在第一句中,空字符串在每個(gè)字符間匹配,所以@chars數(shù)組是一個(gè)字符的數(shù)組。>>
//之間的部分表示split用到的正則表達(dá)式(或者說分隔法則)
\s是一種通配符,代表空格
+代表重復(fù)一次或者一次以上。
所以,\s+代表一個(gè)或者一個(gè)以上的空格。
split(/\s+/,$line)表示把字符串$line,按空格為界分開。
比如說,$line="你好朋友歡迎光臨我的網(wǎng)站jb51.net";
split(/\s+/,$line)后得到:
你好朋友歡迎訪問我的網(wǎng)站jb51.net
一般用法: @somearray = split(/:+/, $string ); #括號(hào)可以不要。 若不指定$string, 則對(duì)默認(rèn)變量$_操作, 兩斜線間為分割符,可以用正則表達(dá)式,強(qiáng)悍異常。
在perl手冊(cè)里,有一個(gè)用法不多見。即: split /PATTERN/, EXPR, LIMIT; 關(guān)鍵就是這個(gè)LIMIT參數(shù),可以節(jié)省不少事情。 如果使用了LIMIT,且是正數(shù),表示分割成不多于LIMIT指定的數(shù)目的域。If LIMIT is unspecified or zero, trailing null fields are stripped (which potential users of pop would do well to remember). If LIMIT is negative, it is treated as if an arbitrarily large LIMIT had been specified. Note that splitting an EXPR that evaluates to the empty string always returns the empty list, regardless of the LIMIT specified.
通過制定LIMIT,可以在很長(zhǎng)(分割產(chǎn)生幾萬個(gè)元素or域)的行分割操作中,只返回關(guān)鍵的前幾列的域值,減少了內(nèi)存使用及時(shí)間消耗。比如一般的基因型數(shù)據(jù),第一列通常是材料命名,需要通過材料名的判斷取舍,這時(shí)候就可以這樣用。 my ($firstfield) = split /\t/, $someline, 1; 如果需要前面幾列的值,這樣的方式對(duì)大文件效率很好: my (undef, $var1, undef, undef, undef, $var2)=split /\t/, $someline, 6;
有網(wǎng)友對(duì)這種方式做了測(cè)試,顯示較好。引用如下:
>>>
一個(gè)文件,每行都有18項(xiàng),各項(xiàng)之間用\t分割,使用時(shí)用到了第6項(xiàng),折騰了幾種用法
復(fù)制代碼 代碼如下:
my @array = split("\t",$_); my $var = $array[6]; 測(cè)試文件平均用時(shí)8.2s
my($var) = (split("\t",$_))[6]; 測(cè)試平均用時(shí)5.1s
my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_); 平均用時(shí)3.53s
my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_,7);平均用時(shí)3.52s
my $var = (split("\t",$_,7))[6]; 平均用時(shí)3.53s
看來后3種才是王道,如果需要使用多項(xiàng)也可以進(jìn)行進(jìn)行適當(dāng)?shù)淖儎?dòng)。不過兩項(xiàng)如果跨度比較大,3,4應(yīng)該是不錯(cuò)選擇,5就只能用中間數(shù)組。
自己動(dòng)手測(cè)試下吧。
您可能感興趣的文章:- ASP中Split分割字符串函數(shù)的實(shí)例用法
- php字符串分割函數(shù)explode的實(shí)例代碼
- js split 的用法和定義 js split分割字符串成數(shù)組的實(shí)例代碼
- php+正則將字符串中的字母數(shù)字和中文分割