perl語言學習系列-----map、grep函數處理數組

由于在代碼中經常用到foreach循環遍歷數組,perl中還存在兩個更為簡單的遍歷數組的函數。

1.map函數

a.語法規則

語法:map EXPR,LIST或map BLOCK LIST
返回值:列表上下文為列表,標量上下文是列表的元素個數
功能描述:map函數的功能主要是遍歷list,每次遍歷執行一次EXPR(表達式)或者BLOCK指
令塊,最后返回EXPR計算后BLOCK最后一行代碼執行后的返回值組成的列表。

注意:map與foreach類似,$_ 為遍歷過程中數組或列表的別名,如果遍歷過程中更改了$_,則對應數組的值會相應改變。

b.map函數示例

@number=map $_+10,1..20;    #將1..20的列表的每個元素加10,然后賦值給@number數組

map $_+=10,1..20 ;    #列表元素都加10

@number=map {split//} 1..20 ;   #將1..20列表的元素切成單個字符,賦值給數組,最后返回的數組是1-9,1,0,1,1一直到1,9,2,0

map {push @arr,$_ if $_>60} @number;      #將數組中大于60的元素選出

2.grep 函數

a.語法規則

語法:grep EXPR,LIST或grep BLOCK list
返回值:列表上下文返回列表,標量上下文返回列表元素個數
功能描述:返回LIST中使EXPR的值或者BLOCK里最后一行代碼運算結果為真的值。

b.grep函數示例

@number60=grep $_ > 60, @number;   #找出數組中大于60的元素  
@seq_200=grep length($_) > 200, @seq; #找出數組中大于200的字符串

# 找出@seq_200里G數目大于9的元素
@seq9=grep {@base=split//,$_; (grep $_ eq "G" , @base) > 9} @seq_200

#找出@seq_200里G數目大于9的元素
@seq=grep ((grep $_ eq "G", split//,$_) > 9, @seq_200)

3.map與grep函數的異與同

兩者都可以進行數組的遍歷,且語法結構類似,相較于foreach都有返回值。map和grep語法中的第二種中的BLOCK可以是多行代碼,map的返回值是多行代碼中的最后一行的返回值。grep則根據BLOCK返回值的真假來決定是否返回列表的值,真則返回,反之不返回。

4.map與grep函數示例演示

隨機生成20條長度為50個堿基的DNA序列,篩選出其中G數目在9個以上的序列并輸出到屏幕。

@base=qw(A T C G);
@seq_20=map {
                    @base_50= map {$base[rand 4]} 1..50;
                     $seq_50=join "",@base;
} 1..20  ;
@seq_g9=grep {
                           $G_number= grep $_ eq "G", split//;
                           $G_number > 9
} @seq_20;

map {print $_,"\n"} @seq_g9; 

也可以簡寫為如下:

@base=qw(A T C G)
map {print $_,"\n"} (grep { (grep $_ eq "G", split//) > 9 }  map {join ("", map {$base[rand 4] } 1..50)} (1..20))

map與grep 是將循環變成了函數,使其能夠有返回值,函數的返回值可以作為另一個函數的操作數,Perl語言又規定所有的函數操作數都寫在函數右側。如此,就可以無限地在函數的返回之前加函數,無需中間變量。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容