本文和大家重點討論一下Perl split函數的用法,Perl中的一個非常有用的函數是Perl split函數-把字串進行分割並把分割後的結果放入數組中。這個Perl split函數使用規則運算式(RE),如果未特定則工作在$_變數上。
Perl split函數
Perl中的一個非常有用的函數是Perl split函數-把字串進行分割並把分割後的結果放入數組中。這個Perl split函數使用規則運算式(RE),如果未特定則工作在$_變數上。
Perl split函數可以這樣使用:
代碼如下:$info="Caine:Michael:Actor:14,LeafyDrive";
@personal=split(/:/,$info);
其結果是:@personal=("Caine","Michael","Actor","14,LeafyDrive");
◆如果我們已經把資訊存放在$_變數中,那麼可以這樣:
代碼如下:@personal=split(/:/);
如果各個域被任何數量的冒號分隔,可以用RE代碼進行分割:
代碼如下:$_="Capes:Geoff::Shotputter:::BigAvenue";
@personal=split(/:+/);
其結果是:@personal=("Capes","Geoff","Shotputter","BigAvenue");
但是下面的代碼:
代碼如下:$_="Capes:Geoff::Shotputter:::BigAvenue";
@personal=split(/:/);
的結果是:@personal=("Capes","Geoff","","Shotputter","","","BigAvenue");
◆這個Perl split函數中單詞可以被分割成字元,句子可以被分割成單詞,段落可以被分割成句子:
代碼如下:@chars=split(//,$word);
@words=split(//,$sentence);
@sentences=split(/\./,$paragraph);
在第一句中,Null 字元串在每個字元間匹配,所以@chars數組是一個字元的數組。>>
//之間的部分表示split用到的Regex(或者說分隔法則)
\s是一種萬用字元,代表空格
+代表重複一次或者一次以上。
所以,\s+代表一個或者一個以上的空格。
split(/\s+/,$line)表示把字串$line,按空格為界分開。
比如說,$line="你好朋友歡迎光臨我的網站jb51.net";
split(/\s+/,$line)後得到:
你好朋友歡迎訪問我的網站jb51.net
一般用法: @somearray = split(/:+/, $string ); #括弧可以不要。 若不指定$string, 則對預設變數$_操作, 兩斜線間為分割符,可以用Regex,強悍異常。
在perl手冊裡,有一個用法不多見。即: split /PATTERN/, EXPR, LIMIT; 關鍵就是這個LIMIT參數,可以節省不少事情。 如果使用了LIMIT,且是正數,表示分割成不多於LIMIT指定的數目的域。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,可以在很長(分割產生幾萬個元素or域)的行分割操作中,只返回關鍵的前幾列的域值,減少了記憶體使用量及時間消耗。比如一般的基因型資料,第一列通常是材料命名,需要通過材料名的判斷取捨,這時候就可以這樣用。 my ($firstfield) = split /\t/, $someline, 1; 如果需要前面幾列的值,這樣的方式對大檔案效率很好: my (undef, $var1, undef, undef, undef, $var2)=split /\t/, $someline, 6;
有網友對這種方式做了測試,顯示較好。引用如下:
>>>
一個檔案,每行都有18項,各項之間用\t分割,使用時用到了第6項,折騰了幾種用法
代碼如下:my @array = split("\t",$_); my $var = $array[6]; 測試檔案平均用時8.2s
my($var) = (split("\t",$_))[6]; 測試平均用時5.1s
my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_); 平均用時3.53s
my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_,7);平均用時3.52s
my $var = (split("\t",$_,7))[6]; 平均用時3.53s
看來後3種才是王道,如果需要使用多項也可以進行進行適當的變動。不過兩項如果跨度比較大,3,4應該是不錯選擇,5就只能用中間數組。
自己動手測試下吧。