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

首頁(yè) > 學(xué)院 > 操作系統(tǒng) > 正文

perl中g(shù)rep的詳細(xì)用法

2024-06-28 13:26:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
perl中g(shù)rep的詳細(xì)用法

最近一直在學(xué)習(xí)perl語(yǔ)言,下面介紹下如果和在perl編程中使用強(qiáng)大的grep函數(shù)。

1. Grep函數(shù)grep有2種表達(dá)方式:

1 grep BLOCK LIST2 grep EXPR, LIST

BLOCK表示一個(gè)code塊,通常用{}表示;EXPR表示一個(gè)表達(dá)式,通常是正則表達(dá)式。原文說(shuō)EXPR可是任何東西,包括一個(gè)或多個(gè)變量,操作符,文字,函數(shù),或子函數(shù)調(diào)用。LIST是要匹配的列表。grep對(duì)列表里的每個(gè)元素進(jìn)行BLOCK或EXPR匹配,它遍歷列表,并臨時(shí)設(shè)置元素為$_。在列表上下文里,grep返回匹配命中的所有元素,結(jié)果也是個(gè)列表。在標(biāo)量上下文里,grep返回匹配命中的元素個(gè)數(shù)。2. Grep 和 loops

1 open FILE "<myfile"ordie"Can't open myfile: $!";2 print grep /terrorism|nuclear/i,<FILE>;

這里打開(kāi)一個(gè)文件myfile,然后查找包含terrorism或nuclear的行。<FILE>返回一個(gè)列表,它包含了文件的完整內(nèi)容。可能你已發(fā)現(xiàn),如果文件很大的話(huà),這種方式很耗費(fèi)內(nèi)存,因?yàn)槲募乃袃?nèi)容都拷貝到內(nèi)存里了。當(dāng)然你也可以使用loop(循環(huán))來(lái)完成:

1  while($line =&lt;FILE&gt;;){2     if($line =~/terrorism|nuclear/i){print $line }3     }

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

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{$_}&lt;2}2 qw(a b a c d d e f g f h h);3 print"@unique/n";

上述code運(yùn)行后會(huì)返回:a b c d e f g h即qw(a b a c d d e f g f h h)這個(gè)列表里的唯一元素被返回了。為什么會(huì)這樣呀?讓我們看看:%count是個(gè)hash結(jié)構(gòu),它的key是遍歷qw()列表時(shí),逐個(gè)抽取的列表元素。++$count{$_}表示$_對(duì)應(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í),它自增后對(duì)應(yīng)的hash值就是1,當(dāng)它第二次當(dāng)作hash關(guān)鍵字時(shí),對(duì)應(yīng)的hash值就變成2了。變成2后,就不滿(mǎn)足比較條件了,所以a不會(huì)第2次出現(xiàn)。所以上述code就能從列表里唯一1次的抽取元素了。

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

1     @crops= qw(wheat corn barley rice corn soybean hay2     alfalfa rice hay beets corn hay);3     @duplicates= grep { $count{$_}==2}4     grep {++$count{$_}&gt;;1}@crops;5     print"@duplicates/n";

運(yùn)行結(jié)果是:rice這里grep了2次哦,順序是從右至左。首先grep { ++$count{$_} >; 1 } @crops;返回一個(gè)列表,列表的結(jié)果是@crops里出現(xiàn)次數(shù)大于1的元素。然后再對(duì)產(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 {-f and-T } glob '* .*';2     print"@files/n";

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

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

1     @array= qw(To be ornot to be that is the question);2     @found_Words=3     grep { $_ =~/b|o/i and++$counts{$_}&lt;2;}@array;4     print"@found_words/n";5      

運(yùn)行結(jié)果是:To be or not to question{}里的意思就是,對(duì)@array里的每個(gè)元素,先匹配它是否包含b或o字符(不分大小寫(xiě)),然后每個(gè)元素出現(xiàn)的次數(shù),必須小于2(也就是1次啦)。grep返回一個(gè)列表,包含了@array里滿(mǎn)足上述2個(gè)條件的元素。

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

1     # An array of references to anonymous arrays2     @data_points=([5,12],[20,-3],3     [2,2],[13,20]);4     @y_gt_x= grep { $_-&gt;;[0]&lt; $_-&gt;;[1]}@data_points;5     foreach $xy (@y_gt_x){print"$xy-&gt;;[0], $xy-&gt;;[1]/n"}

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

1     foreach(@data_points){2     print $_-&gt;;[0];}

這樣訪(fǎng)問(wèn)到匿名數(shù)組里的第1個(gè)元素,把0替換成1就是第2個(gè)元素了。所以{ $_->;[0] < $_->;[1] }就很明白了哦,它表示每個(gè)匿名數(shù)組的第一個(gè)元素的值,小于第二個(gè)元素的值。而grep { $_->;[0] < $_->;[1] } @data_points; 就會(huì)返回滿(mǎn)足上述條件的匿名數(shù)組列表。

參考:perl語(yǔ)言學(xué)習(xí)


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 贵阳市| 泸水县| 湖北省| 鸡东县| 崇明县| 共和县| 综艺| 华宁县| 沿河| 常宁市| 克东县| 中阳县| 河池市| 孝义市| 通州区| 张家川| 安达市| 博罗县| 汶川县| 志丹县| 义马市| 枣强县| 萨嘎县| 凤冈县| 杂多县| 舟曲县| 共和县| 阆中市| 云龙县| 新化县| 金山区| 洪湖市| 高台县| 永修县| 丰台区| 徐水县| 乌拉特前旗| 蕉岭县| 交口县| 博湖县| 嘉黎县|