亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

perl中grep的詳細用法

2024-06-28 13:26:16
字體:
來源:轉載
供稿:網友
perl中grep的詳細用法

最近一直在學習perl語言,下面介紹下如果和在perl編程中使用強大的grep函數。

1. Grep函數grep有2種表達方式:

1 grep BLOCK LIST2 grep EXPR, LIST

BLOCK表示一個code塊,通常用{}表示;EXPR表示一個表達式,通常是正則表達式。原文說EXPR可是任何東西,包括一個或多個變量,操作符,文字,函數,或子函數調用。LIST是要匹配的列表。grep對列表里的每個元素進行BLOCK或EXPR匹配,它遍歷列表,并臨時設置元素為$_。在列表上下文里,grep返回匹配命中的所有元素,結果也是個列表。在標量上下文里,grep返回匹配命中的元素個數。2. Grep 和 loops

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

這里打開一個文件myfile,然后查找包含terrorism或nuclear的行。<FILE>返回一個列表,它包含了文件的完整內容??赡苣阋寻l現,如果文件很大的話,這種方式很耗費內存,因為文件的所有內容都拷貝到內存里了。當然你也可以使用loop(循環)來完成:

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

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

1. 統計匹配表達式的列表元素個數

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

在標量上下文里,grep返回匹配中的元素個數;在列表上下文里,grep返回匹配中的元素的一個列表。所以,上述code返回apple單詞在@fruits數組中存在的個數。因為$num_apple是個標量,它強迫grep結果位于標量上下文里。

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運行后會返回:a b c d e f g h即qw(a b a c d d e f g f h h)這個列表里的唯一元素被返回了。為什么會這樣呀?讓我們看看:%count是個hash結構,它的key是遍歷qw()列表時,逐個抽取的列表元素。++$count{$_}表示$_對應的hash值自增。在這個比較上下文里,++$count{$_}與$count{$_}++的意義是不一樣的哦,前者表示在比較之前,就將自身值自增1;后者表示在比較之后,才將自身值自增1。所以,++$count{$_} < 2 表示將$count{$_}加1,然后與2進行比較。$count{$_}值默認是undef或0。所以當某個元素a第一次被當作hash的關鍵字時,它自增后對應的hash值就是1,當它第二次當作hash關鍵字時,對應的hash值就變成2了。變成2后,就不滿足比較條件了,所以a不會第2次出現。所以上述code就能從列表里唯一1次的抽取元素了。

2. 抽取列表里精確出現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";

運行結果是:rice這里grep了2次哦,順序是從右至左。首先grep { ++$count{$_} >; 1 } @crops;返回一個列表,列表的結果是@crops里出現次數大于1的元素。然后再對產生的臨時列表進行grep { $count{$_} == 2 }計算,這里的意思你也該明白了,就是臨時列表里,元素出現次數等于2的被返回。所以上述code就返回rice了,rice出現次數大于1,并且精確等于2,明白了吧?

3. 在當前目錄里列出文本文件

1     @files= grep {-f and-T } glob '* .*';2     print"@files/n";

glob返回一個列表,它的內容是當前目錄里的任何文件,除了以’.'開頭的。{}是個code塊,它包含了匹配它后面的列表的條件。這只是 grep的另一種用法,其實與 grep EXPR,LIST 這種用法差不多了。-f and -T 匹配列表里的元素,首先它必須是個普通文件,接著它必須是個文本文件。據說這樣寫效率高點哦,因為-T開銷更大,所以在判斷-T前,先判斷-f了。

4. 選擇數組元素并消除重復

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      

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

5. 從二維數組里選擇元素,并且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"}

運行結果是:5, 1213, 20這里,你應該理解匿名數組哦,[]是個匿名數組,它實際上是個數組的引用(類似于C里面的指針)。@data_points的元素就是匿名數組。例如:

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

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

參考:perl語言學習


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人黄色在线免费| 一区二区三区天堂av| 国产日韩欧美影视| 亚洲国产精品成人av| 国产精品网站视频| 国产成人亚洲精品| 亚洲国产日韩欧美在线图片| 亚洲国产另类 国产精品国产免费| 亚洲r级在线观看| 国产97人人超碰caoprom| 欧美性极品少妇精品网站| 69久久夜色精品国产69乱青草| 成人网在线免费看| 中文字幕精品网| 中文国产成人精品| 亚洲а∨天堂久久精品喷水| 国产精品久久久久久久久久新婚| 久久久久九九九九| 国产精欧美一区二区三区| 精品国产欧美成人夜夜嗨| 久久久久亚洲精品国产| 欧美xxxx做受欧美| 亚洲国产精品福利| 欧美精品成人91久久久久久久| 国产成人精品免高潮费视频| 亚洲第一色中文字幕| 97精品国产97久久久久久春色| 精品成人av一区| 日韩在线www| 欧美大片在线看免费观看| 成人乱人伦精品视频在线观看| 亚洲女人天堂色在线7777| 黄色成人av在线| 国产成人精品久久亚洲高清不卡| 中文字幕无线精品亚洲乱码一区| 亚洲精品电影网在线观看| 国产精品永久免费在线| 成人女保姆的销魂服务| 亚洲欧美一区二区三区在线| 97久久超碰福利国产精品…| 欧美中文字幕第一页| 欧美一区二三区| 在线国产精品播放| 国产精品一区二区三区免费视频| 日韩电影中文字幕在线观看| 亚洲欧洲在线观看| 欧美中文在线免费| 国产精品久久在线观看| 日本不卡高字幕在线2019| 国产精品流白浆视频| 主播福利视频一区| 欧美国产精品人人做人人爱| 亚洲国语精品自产拍在线观看| 在线观看日韩www视频免费| 毛片精品免费在线观看| 国产欧美一区二区三区久久人妖| 国产suv精品一区二区| 国产成人97精品免费看片| 在线播放日韩av| 亚洲精品中文字幕有码专区| 国产精品18久久久久久首页狼| www国产精品com| 亚洲国产日韩欧美综合久久| 久久天天躁狠狠躁老女人| 久久久噜噜噜久噜久久| 国产一区二区三区精品久久久| 久久91超碰青草是什么| 45www国产精品网站| 国产精品综合不卡av| 国产日韩欧美自拍| 成人激情视频在线播放| 97超碰色婷婷| 国产一区二区三区在线免费观看| 欧美高清无遮挡| 精品亚洲一区二区| 久久精品亚洲热| 欧美电影在线观看高清| 久久视频在线直播| 精品视频9999| 国语自产精品视频在线看一大j8| 国产精品日韩一区| 久久影院中文字幕| 欧美日韩激情网| 97精品一区二区三区| 亚洲国产成人精品一区二区| 国产精品久久久久免费a∨| 最近2019免费中文字幕视频三| 国产一区二区丝袜| 亚洲欧美另类中文字幕| 欧美精品久久久久久久| 最近2019年手机中文字幕| 欧美日韩一区二区在线播放| 国产精品久久久久久婷婷天堂| 久久免费视频在线| 亚洲自拍中文字幕| 成人伊人精品色xxxx视频| 一本色道久久88亚洲综合88| 亚洲女人天堂av| 亚洲国产古装精品网站| 91人人爽人人爽人人精88v| 日韩av网站在线| 久久久久久久久久av| 亚洲第一天堂无码专区| 欧美性xxxxx| 97色在线观看| 亚洲男人天堂2019| 91视频88av| 亚洲欧美国产制服动漫| 国产精品久久一区主播| 国产精品99一区| 亚洲毛片一区二区| 色一区av在线| 91视频88av| 亚洲视频视频在线| 国产精品自拍网| 欧美大片欧美激情性色a∨久久| 国内精品视频在线| 国产一区二区三区丝袜| 黑丝美女久久久| 国产精品美女网站| 欧美主播福利视频| 亚洲免费视频在线观看| 米奇精品一区二区三区在线观看| 亚洲天堂免费在线| 亚洲精品日韩在线| 久久成人免费视频| 国产精品国产自产拍高清av水多| 亚洲自拍中文字幕| 欧美日韩国产成人在线观看| 日韩视频免费在线| 欧美久久精品一级黑人c片| 亚洲综合精品伊人久久| 8x海外华人永久免费日韩内陆视频| 国产精品99导航| 亚洲精品91美女久久久久久久| 久久99久久久久久久噜噜| 国产99久久精品一区二区 夜夜躁日日躁| 欧美在线激情视频| 色偷偷av一区二区三区| 中文字幕少妇一区二区三区| 57pao国产成人免费| 国产精品99久久久久久www| 亚洲成人久久电影| 欧美视频中文字幕在线| 91麻豆桃色免费看| 欧美激情乱人伦一区| 国产精品一二三视频| 亚洲a级在线播放观看| 亚洲欧美日韩中文在线| 欧美激情精品久久久久久免费印度| 亚洲成人1234| 久久人人爽人人爽人人片亚洲| 亚洲综合日韩在线| 国产日韩欧美中文在线播放| 久久av资源网站| 国产欧美精品一区二区三区介绍| 日韩欧美a级成人黄色| 精品偷拍一区二区三区在线看| 亚洲97在线观看| 亚洲第一网站免费视频| 亚洲欧美精品suv| 亚洲人成网站色ww在线| 麻豆一区二区在线观看| 欧美日韩免费在线观看|