[英]The use of map or grep in Perl
我已經寫了幾個月的全職perl代碼(生物信息學),並且總是試圖提高我的技能。 就在今天,我突然意識到我從不使用地圖或grep。 回顧一下我的代碼,我意識到這些工具可以在這里或那里省去幾行,但只是犧牲了foreach循環的靈活性。 我的問題如下:
你有沒有遇到過使用map或grep比foreach / for循環帶來顯着優勢的情況,除了保存一行或兩行代碼之外?
謝謝你的時間!
Schwartzian變換就是一個例子:
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, foo($_)] }
@unsorted;
你可以用一堆foreach
循環來做到這一點,但是你必須將它們分開以找出發生了什么; 一旦你看到Schwartzian變換,你就會立即認出這個成語。
一般來說,我認為map
和grep
很好,因為它們允許你在沒有語法層的情況下清晰而緊湊地表示你的意圖。 如果您看到map
那么您就知道正在進行某種簡單的數據結構轉換; 如果你看到一個grep
然后你知道正在進行一些過濾/選擇。 您可以使用foreach
完成所有操作,但代碼的意圖並不像map
或grep
那樣清晰; 如果你願意,你甚至可以用if
和goto
完成所有這些,但是你的意圖將被埋沒在更多的語法和狀態跟蹤之下。
我經常使用map
和grep
。 並且first
apply
List::MoreUtils
any
其他List::MoreUtils
。 我發現,在一般情況下,他們解釋代碼是做,而不是代碼是如何做的。
一般來說,我發現當我的代碼與規范讀取相同時,它更可能是正確的,並且更有可能處理角落/邊緣情況。 Perl允許我比過去使用的任何語言都做得更好,並且我利用它。
例如,如果我的規范說如果$blah
在某個列表中,我將執行foo()
,我的代碼就是這樣讀取的:
foo() if any { $_ eq $blah } some_list();
其余這些工具的想法相同。 代碼和規范看起來非常相似,這是Perl的優點之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.