由于在代碼中經常用到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語言又規定所有的函數操作數都寫在函數右側。如此,就可以無限地在函數的返回之前加函數,無需中間變量。