国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Perl > 正文

Perl split字符串分割函數(shù)用法指南

2020-10-31 15:19:03
字體:
供稿:網(wǎng)友

本文和大家重點討論一下Perl split函數(shù)的用法,Perl中的一個非常有用的函數(shù)是Perl split函數(shù)-把字符串進行分割并把分割后的結(jié)果放入數(shù)組中。這個Perl split函數(shù)使用規(guī)則表達式(RE),如果未特定則工作在$_變量上。

Perl split函數(shù)

Perl中的一個非常有用的函數(shù)是Perl split函數(shù)-把字符串進行分割并把分割后的結(jié)果放入數(shù)組中。這個Perl split函數(shù)使用規(guī)則表達式(RE),如果未特定則工作在$_變量上。

Perl split函數(shù)可以這樣使用: 

復制代碼 代碼如下:

$info="Caine:Michael:Actor:14,LeafyDrive"; 
@personal=split(/:/,$info); 


其結(jié)果是:@personal=("Caine","Michael","Actor","14,LeafyDrive");

◆如果我們已經(jīng)把信息存放在$_變量中,那么可以這樣:

復制代碼 代碼如下:

@personal=split(/:/);

如果各個域被任何數(shù)量的冒號分隔,可以用RE代碼進行分割: 

復制代碼 代碼如下:

$_="Capes:Geoff::Shotputter:::BigAvenue"; 
@personal=split(/:+/); 

其結(jié)果是:@personal=("Capes","Geoff","Shotputter","BigAvenue");

但是下面的代碼:

復制代碼 代碼如下:

$_="Capes:Geoff::Shotputter:::BigAvenue"; 
@personal=split(/:/);

的結(jié)果是:@personal=("Capes","Geoff","","Shotputter","","","BigAvenue");

◆這個Perl split函數(shù)中單詞可以被分割成字符,句子可以被分割成單詞,段落可以被分割成句子:

復制代碼 代碼如下:

@chars=split(//,$word);
@words=split(//,$sentence); 
@sentences=split(//./,$paragraph); 

在第一句中,空字符串在每個字符間匹配,所以@chars數(shù)組是一個字符的數(shù)組。>>

//之間的部分表示split用到的正則表達式(或者說分隔法則)
/s是一種通配符,代表空格
+代表重復一次或者一次以上。
所以,/s+代表一個或者一個以上的空格。
split(//s+/,$line)表示把字符串$line,按空格為界分開。
比如說,$line="你好朋友歡迎光臨我的網(wǎng)站VeVB.COm";
split(//s+/,$line)后得到:
你好朋友歡迎訪問我的網(wǎng)站VeVB.COm

一般用法: @somearray = split(/:+/, $string ); #括號可以不要。  若不指定$string, 則對默認變量$_操作, 兩斜線間為分割符,可以用正則表達式,強悍異常。

在perl手冊里,有一個用法不多見。即: split /PATTERN/, EXPR, LIMIT;  關(guān)鍵就是這個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,可以在很長(分割產(chǎn)生幾萬個元素or域)的行分割操作中,只返回關(guān)鍵的前幾列的域值,減少了內(nèi)存使用及時間消耗。比如一般的基因型數(shù)據(jù),第一列通常是材料命名,需要通過材料名的判斷取舍,這時候就可以這樣用。 my ($firstfield) = split //t/, $someline, 1;  如果需要前面幾列的值,這樣的方式對大文件效率很好: my (undef, $var1, undef, undef, undef, $var2)=split //t/, $someline, 6;

有網(wǎng)友對這種方式做了測試,顯示較好。引用如下:
>>>
一個文件,每行都有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種才是王道,如果需要使用多項也可以進行進行適當?shù)淖儎印2贿^兩項如果跨度比較大,3,4應該是不錯選擇,5就只能用中間數(shù)組。

自己動手測試下吧。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉门市| 海口市| 乌审旗| 湖南省| 石柱| 峨边| 仲巴县| 阿勒泰市| 上林县| 雷州市| 巫溪县| 班戈县| 富宁县| 清镇市| 潜江市| 临江市| 广州市| 泰宁县| 阿巴嘎旗| 铜鼓县| 龙海市| 安福县| 镶黄旗| 临洮县| 繁昌县| 丹巴县| 棋牌| 徐州市| 贵溪市| 南澳县| 嵊州市| 民县| 东山县| 琼结县| 铅山县| 沿河| 渭南市| 贵阳市| 海丰县| 宝兴县| 麻栗坡县|