自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Perl grep函數(shù)用法詳解

開發(fā) 架構(gòu)
Perl grep函數(shù)有很多值得學(xué)習(xí)的地方,它用法你是否熟悉,本文向大家簡單介紹一下,希望本文的介紹能讓你有所收獲。

本文和大家重點(diǎn)學(xué)習(xí)一下Perl grep函數(shù)的用法,Perl grep函數(shù)有兩種表達(dá)方式,具體是哪兩種請看本文的詳細(xì)介紹吧。

Perl grep函數(shù)詳解

(一)grep有2種表達(dá)方式:

◆grepBLOCKLIST
◆grepEXPR,LIST

BLOCK表示一個(gè)code塊,通常用{}表示;EXPR表示一個(gè)表達(dá)式,通常是正則表達(dá)式。原文說EXPR可是任何東西,包括一個(gè)或多個(gè)變量,操作符,文字,函數(shù),或子函數(shù)調(diào)用。
LIST是要匹配的列表。

Perl grep函數(shù)對列表里的每個(gè)元素進(jìn)行BLOCK或EXPR匹配,它遍歷列表,并臨時(shí)設(shè)置元素為$_。在列表上下文里,grep返回匹配命中的所有元素,結(jié)果也是個(gè)列表。在標(biāo)量上下文里,grep返回匹配命中的元素個(gè)數(shù)。

(二)grepvs.loops

openFILE"printgrep/terrorism|nuclear/i,;;

這里打開一個(gè)文件myfile,然后查找包含terrorism或nuclear的行。;返回一個(gè)列表,它包含了文件的完整內(nèi)容。可能你已發(fā)現(xiàn),如果文件很大的話,這種方式很耗費(fèi)內(nèi)存,因?yàn)槲募乃袃?nèi)容都拷貝到內(nèi)存里了。

代替的方式是使用loop(循環(huán))來完成:

  1. while($line=;){  
  2. if($line=~/terrorism|nuclear/i){print$line}  

上述code顯示,loop可以完成grep能做的任何事情。那為什么還要用grep呢?答案是grep更具Perl風(fēng)格,而loop是C風(fēng)格的。
更好的解釋是:(1)grep讓讀者更顯然的知道,你在從列表里選擇某元素;(2)grep比loop簡潔。
一點(diǎn)建議:如果你是Perl新手,那就規(guī)矩的使用loop比較好;等你熟悉Perl了,就可使用grep這個(gè)有力的工具。

(三)幾個(gè)Perl grep函數(shù)的示例

1.統(tǒng)計(jì)匹配表達(dá)式的列表元素個(gè)數(shù)

$num_apple=grep/^apple$/i,@fruits;

在標(biāo)量上下文里,grep返回匹配中的元素個(gè)數(shù);在列表上下文里,grep返回匹配中的元素的一個(gè)列表。

所以,上述code返回apple單詞在@fruits數(shù)組中存在的個(gè)數(shù)。因?yàn)?num_apple是個(gè)標(biāo)量,它強(qiáng)迫grep結(jié)果位于標(biāo)量上下文里。

2.從列表里抽取***元素

  1. @unique=grep{++$count{$_}<2}  
  2. qw(abacddefgfhh);  
  3. print"@uniquen"; 

上述code運(yùn)行后會(huì)返回:abcdefgh
即qw(abacddefgfhh)這個(gè)列表里的***元素被返回了。為什么會(huì)這樣呀?讓我們看看:

%count是個(gè)hash結(jié)構(gòu),它的key是遍歷qw()列表時(shí),逐個(gè)抽取的列表元素。++$count{$_}表示$_對應(yīng)的hash值自增。在這個(gè)比較上下文里,++$count{$_}與$count{$_}++的意義是不一樣的哦,前者表示在比較之前,就將自身值自增1;后者表示在比較之后,才將自身值自增1。所以,++$count{$_}<2表示將$count{$_}加1,然后與2進(jìn)行比較。$count{$_}值默認(rèn)是undef或0。所以當(dāng)某個(gè)元素a***次被當(dāng)作hash的關(guān)鍵字時(shí),它自增后對應(yīng)的hash值就是1,當(dāng)它第二次當(dāng)作hash關(guān)鍵字時(shí),對應(yīng)的hash值就變成2了。變成2后,就不滿足比較條件了,所以a不會(huì)第2次出現(xiàn)。

所以上述code就能從列表里***1次的抽取元素了。

◆抽取列表里精確出現(xiàn)2次的元素

  1. @crops=qw(wheatcornbarleyricecornsoybeanhay  
  2. alfalfaricehaybeetscornhay);  
  3. @duplicates=grep{$count{$_}==2}  
  4. grep{++$count{$_}>;1}@crops;  
  5. print"@duplicatesn"; 

運(yùn)行結(jié)果是:rice

這里grep了2次哦,順序是從右至左。首先grep{++$count{$_}>;1}@crops;返回一個(gè)列表,列表的結(jié)果是@crops里出現(xiàn)次數(shù)大于1的元素。
然后再對產(chǎn)生的臨時(shí)列表進(jìn)行g(shù)rep{$count{$_}==2}計(jì)算,這里的意思你也該明白了,就是臨時(shí)列表里,元素出現(xiàn)次數(shù)等于2的被返回。

所以上述code就返回rice了,rice出現(xiàn)次數(shù)大于1,并且精確等于2,明白了吧?:-)

3.在當(dāng)前目錄里列出文本文件

  1. @files=grep{-fand-T}glob'*.*';  
  2. print"@filesn"; 

這個(gè)就很容易理解哦。glob返回一個(gè)列表,它的內(nèi)容是當(dāng)前目錄里的任何文件,除了以'.'開頭的。{}是個(gè)code塊,它包含了匹配它后面的列表的條件。這只是grep的另一種用法,其實(shí)與grepEXPR,LIST這種用法差不多了。-fand-T匹配列表里的元素,首先它必須是個(gè)普通文件,接著它必須是個(gè)文本文件。據(jù)說這樣寫效率高點(diǎn)哦,因?yàn)?T開銷更大,所以在判斷-T前,先判斷-f了。

4.選擇數(shù)組元素并消除重復(fù)

  1. @array=qw(Tobeornottobethatisthequestion);  
  2. @found_words=  
  3. grep{$_=~/b|o/iand++$counts{$_}<2;}@array;  
  4. print"@found_wordsn"; 

運(yùn)行結(jié)果是:Tobeornottoquestion

{}里的意思就是,對@array里的每個(gè)元素,先匹配它是否包含b或o字符(不分大小寫),然后每個(gè)元素出現(xiàn)的次數(shù),必須小于2(也就是1次啦)。
grep返回一個(gè)列表,包含了@array里滿足上述2個(gè)條件的元素。


5.從二維數(shù)組里選擇元素,并且x

  1. #Anarrayofreferencestoanonymousarrays  
  2. @data_points=([5,12],[20,-3],  
  3. [2,2],[13,20]);  
  4. @y_gt_x=grep{$_->;[0]<$_->;[1]}@data_points;  
  5. foreach$xy(@y_gt_x){print"$xy->;[0],$xy->;[1]n"} 

運(yùn)行結(jié)果是:
5,12
13,20

這里,你應(yīng)該理解匿名數(shù)組哦,[]是個(gè)匿名數(shù)組,它實(shí)際上是個(gè)數(shù)組的引用(類似于C里面的指針)。
@data_points的元素就是匿名數(shù)組。例如:

foreach(@data_points){
print$_->;[0];}

這樣訪問到匿名數(shù)組里的第1個(gè)元素,把0替換成1就是第2個(gè)元素了。

所以{$_->;[0]<$_->;[1]}就很明白了哦,它表示每個(gè)匿名數(shù)組的***個(gè)元素的值,小于第二個(gè)元素的值。而grep{$_->;[0]<$_->;[1]}@data_points;就會(huì)返回滿足上述條件的匿名數(shù)組列表。所以,就得到你要的結(jié)果啦!

6.簡單數(shù)據(jù)庫查詢

Perl grep函數(shù)的{}復(fù)雜程度如何,取決于program可用虛擬內(nèi)存的數(shù)量。如下是個(gè)復(fù)雜的{}示例,它模擬了一個(gè)數(shù)據(jù)庫查詢:

 

  1. #@databaseisarrayofreferencestoanonymoushashes  
  2. @database=(  
  3. {name=>;"WildGinger",  
  4. city=>;"Seattle",  
  5. cuisine=>;"AsianThaiChineseKoreanJapanese",  
  6. expense=>;4,  
  7. music=>;"",  
  8. meals=>;"lunchdinner",  
  9. view=>;"",  
  10. smoking=>;"",  
  11. parking=>;"validated",  
  12. rating=>;4,  
  13. payment=>;"MCVISAAMEX",  
  14. },  
  15. #{...},etc.  
  16. );  
  17.  
  18. subfindRestaurants{  
  19. my($database,$query)=@_;  
  20. returngrep{  
  21. $query->;{city}?  
  22. lc($query->;{city})eqlc($_->;{city}):1  
  23. and$query->;{cuisine}?  
  24. $_->;{cuisine}=~/$query->;{cuisine}/i:1  
  25. and$query->;{min_expense}?  
  26. $_->;{expense}>;=$query->;{min_expense}:1  
  27. and$query->;{max_expense}?  
  28. $_->;{expense}<=$query->;{max_expense}:1  
  29. and$query->;{music}?$_->;{music}:1  
  30. and$query->;{music_type}?  
  31. $_->;{music}=~/$query->;{music_type}/i:1  
  32. and$query->;{meals}?  
  33. $_->;{meals}=~/$query->;{meals}/i:1  
  34. and$query->;{view}?$_->;{view}:1  
  35. and$query->;{smoking}?$_->;{smoking}:1  
  36. and$query->;{parking}?$_->;{parking}:1  
  37. and$query->;{min_rating}?  
  38. $_->;{rating}>;=$query->;{min_rating}:1  
  39. and$query->;{max_rating}?  
  40. $_->;{rating}<=$query->;{max_rating}:1  
  41. and$query->;{payment}?  
  42. $_->;{payment}=~/$query->;{payment}/i:1  
  43. }@$database;  
  44. }  
  45.  
  46. %query=(city=>;'Seattle',cuisine=>;'Asian|Thai');  
  47. @restaurants=findRestaurants(@database,%query);  
  48. print"$restaurants[0]->;{name}n";  
  49.  

 運(yùn)行結(jié)果是:WildGinger

【編輯推薦】

  1. Eclipse平臺(tái)中Perl腳本開發(fā)
  2. Perl學(xué)習(xí)筆記----Perl命令行
  3. Perl數(shù)組和引用使用指導(dǎo)
  4. Perl基礎(chǔ) 解析Perl標(biāo)量和數(shù)組概念
  5. Perl模式匹配中的特殊字符用法指南

 

責(zé)任編輯:佚名 來源: csdn.net
相關(guān)推薦

2010-07-19 10:01:57

Perl函數(shù)

2010-07-23 15:59:33

Perl encode

2010-07-16 16:40:48

Perl引用

2010-07-16 09:50:23

Perl控制結(jié)構(gòu)

2010-07-19 15:01:26

Perl數(shù)學(xué)函數(shù)

2010-07-23 14:04:43

Perl grep函數(shù)

2010-07-19 14:13:41

Perl函數(shù)

2010-07-16 16:56:01

Perl構(gòu)造函數(shù)

2010-07-19 14:20:57

Perl函數(shù)

2010-07-16 10:20:46

Perl關(guān)聯(lián)數(shù)組

2010-07-21 09:57:46

Perl文件

2010-07-21 10:10:50

Perl split函

2010-07-13 09:14:21

Perl時(shí)間處理函數(shù)

2010-07-19 14:37:01

Perl進(jìn)程啟動(dòng)函數(shù)

2010-07-26 10:09:01

Perl split函

2010-07-21 10:32:05

Perl函數(shù)返回值

2010-07-19 15:25:39

Perl標(biāo)量轉(zhuǎn)換函數(shù)

2010-07-16 17:04:38

Perl方法

2010-07-14 16:21:48

Perl

2010-07-15 13:50:16

Perl目錄操作函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號