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

學(xué)習(xí)筆記 Perl grep函數(shù)使用揭秘

開發(fā) 架構(gòu)
本文介紹一下Perl grep函數(shù)的概念,它會根據(jù)LIST中的元素對BLOCK或EXPR做出評估,而且會把局部變量$_設(shè)置為當(dāng)前所用的LIST中的元素。

本文和大家重點(diǎn)討論一下Perl grep函數(shù)的使用,Perl grep函數(shù)會根據(jù)LIST中的元素對BLOCK或EXPR做出評估,BLOCK塊是一個或多個由花括號分隔開的Perl語句。而List則是一串被排序的值。

Perl grep函數(shù)的使用

關(guān)于Perl grep函數(shù)

(如果你是個Perl的新手,你可以先跳過下面的兩段,直接到Grepvs.loops樣例這一部分,放心,在后面你還會遇到它)

grepBLOCKLIST
grepEXPR,LIST

Perl grep函數(shù)會根據(jù)LIST中的元素對BLOCK或EXPR做出評估,而且會把局部變量$_設(shè)置為當(dāng)前所用的LIST中的元素。BLOCK塊是一個或多個由花括號分隔開的Perl語句。而List則是一串被排序的值。EXPR是一個或多個變量,操作符,字符,函數(shù),子程序調(diào)用的綜合體。Grep會返回一組經(jīng)BLOCK或EXPR塊的估值后是真的元素。如果BLOCK塊由多個語句組成,那么Grep以BLOCK中的最后一條語句的估計值為準(zhǔn)。LIST可以是一個列表也可以是一個數(shù)組。在標(biāo)量上下文中,grep返回的是可以被BLOCK或EXPR估為真的元素個數(shù)。

請避免在BLOCK或EXPR塊中修改$_,因?yàn)檫@會相應(yīng)的修改LIST中的元素。同時還要避免把grep返回的列表做為左值使用,因?yàn)檫@也會修改LIST中的元素。(所謂左值變量就是一個在賦值表達(dá)式左邊的變量)。一些Perlhackers可能會利用這個所謂的"特性",但是我建議你不要使用這種混亂的編程風(fēng)格.

Perl grep函數(shù)與循環(huán)

這個例子打印出myfile這個文件中含有terriosm和nuclear的行(大小寫不敏感).

  1. openFILE"<myfile"ordie"Can'topenmyfile:$!";  
  2. printgrep/terrorism|nuclear/i,<FILE>


對于文件很大的情況,這段代碼耗費(fèi)很多內(nèi)存。因?yàn)間rep把它的第二個參數(shù)作為一個列表上下文看待,所以<>操作符返回的是整個的文件。更有效的代碼應(yīng)該這樣寫:

 

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

通過上面可以看到,使用循環(huán)可以完成所有g(shù)rep可以完成的工作。那為什么我們還要使用grep呢?一個直觀的答案是grep的風(fēng)格更像Perl,而loops(循環(huán))則是C的風(fēng)格。一個更好的答案是,首先,grep很直觀的告訴讀者正在進(jìn)行的操作是從一串值中選出想要的。其次,grep比循環(huán)簡潔。(用軟件工程的說法就是grep比循環(huán)更具有內(nèi)聚力)?;旧?,如果你對Perl不是很熟悉,隨便你使用循環(huán)。否則,你應(yīng)該多使用像grep這樣的強(qiáng)大工具.

計算數(shù)組中匹配給定模式的元素個數(shù)
在一個標(biāo)量上下文中,grep返回的是匹配的元素個數(shù).

$num_apple=grep/^apple$/i,@fruits;^和$匹配符的聯(lián)合使用指定了只匹配那些以apple開頭且同時以apple結(jié)尾的元素。這里grep匹配apple但是pineapple就不匹配。

輸出列表中的不同元素

 

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

輸出結(jié)果:abcdefgh$count{$_}是Perl散列中的一個元素,是一個鍵值對(Perl中的散列和計算機(jī)科學(xué)中的哈希表有關(guān)系,但不完全相同)這里count散列的鍵就是輸入列表中的各個值,而各鍵對應(yīng)的值就是該鍵是否使BLOCK估值為真的次數(shù)。當(dāng)一個值第一次出現(xiàn)的時候BLOCK的值被估為真(因?yàn)樾∮?),當(dāng)該值再次出現(xiàn)的時候就會被估計為假(因?yàn)榈扔诨虼笥?)。

取出列表中出現(xiàn)兩次的值

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

在grep的第一個列表元素被傳給BLOCK或EXPR塊前,第二個參數(shù)被當(dāng)作列表上下文看待。這意味著,第二個grep將在左邊的grep開始對BLOCK進(jìn)行估值之前完全讀入count散列。

列出當(dāng)前目錄中的文本文件

@files=grep{-fand-T}glob'*.*';
print"@files\n";
glob函數(shù)是獨(dú)立于操作系統(tǒng)的,它像Unix的shell一樣對文件的擴(kuò)展名進(jìn)行估計。單個的*表示匹配所以當(dāng)前目錄下不以.開頭的文件,.*表示匹配當(dāng)前目錄下以.開頭的所有文件.如果一個文件是文本文件-f和-T文件測試符則返回真。使用-fand-T進(jìn)行測試要比單用-T進(jìn)行測試有效,因?yàn)槿绻粋€文件沒有通過-f測試,那么-T測試就不會進(jìn)行,而-f測試比-T耗時更少.

從數(shù)組中選出元素并消除重復(fù)

 

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

輸出結(jié)果:
Tobeornottobethatisthequestion
Tobeornottoquestio
邏輯表達(dá)式$_=~/b|o/i匹配包含有b或o的元素(區(qū)別大小寫)。把匹配操作放在計數(shù)工作前要比把計數(shù)工作放在前面有效些。比如,如果左邊的表達(dá)式測試失敗,那么右邊的表達(dá)式就不會被計算.

選出二維坐標(biāo)數(shù)組中橫坐標(biāo)大于縱坐標(biāo)的元素

 

  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"} 

輸出結(jié)果:
5,12
13,20

在數(shù)據(jù)庫中查找餐館

這個例子實(shí)現(xiàn)數(shù)據(jù)庫的方法不適合在實(shí)際中使用的,但是它說明了使用Perl grep函數(shù)的時候,只要你的內(nèi)存夠用,BLOCK塊的復(fù)雜度基本沒有限制.

 

  1. #@databaseisarrayofreferencestoanonymoushashes  
  2. @database=(  
  3. {name=>"WildGinger",  
  4. city=>"Seattle",  
  5. cuisine=>"AsianThaiChineseKoreanJapanese",  
  6. expense=>4,  
  7. music=>"\0",  
  8. meals=>"lunchdinner",  
  9. view=>"\0",  
  10. smoking=>"\0",  
  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.  

 

輸出結(jié)果:WildGinger

【編輯推薦】

  1. Eclipse平臺中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-21 14:18:27

Perl函數(shù)

2010-07-23 13:53:33

Perl grep函數(shù)

2010-07-19 15:31:10

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

2010-07-26 10:09:01

Perl split函

2010-07-21 13:27:06

Perl模式匹配

2010-07-13 12:50:47

Perl變量

2010-07-21 14:08:28

Perl命令行

2010-07-16 12:50:45

Perl語言

2010-07-15 18:04:20

Perl模式

2010-07-20 15:18:41

Perl基本語法

2010-07-26 10:51:26

Perl模式匹配

2010-07-13 13:15:17

Perl

2010-07-16 17:38:12

Perl包

2010-07-13 15:43:57

Perl語言

2010-07-15 10:07:29

Perl指令

2010-07-19 09:08:38

Perl模塊

2010-07-15 11:29:25

Perl格式化輸出

2010-07-15 14:54:50

Perl線程

2010-07-20 10:58:39

Perl腳本

2010-07-19 11:07:13

Perl控制結(jié)構(gòu)
點(diǎn)贊
收藏

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