簡體   English   中英

在Perl中使用map或grep

[英]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變換,你就會立即認出這個成語。

一般來說,我認為mapgrep很好,因為它們允許你在沒有語法層的情況下清晰而緊湊地表示你的意圖。 如果您看到map那么您就知道正在進行某種簡單的數據結構轉換; 如果你看到一個grep然后你知道正在進行一些過濾/選擇。 您可以使用foreach完成所有操作,但代碼的意圖並不像mapgrep那樣清晰; 如果你願意,你甚至可以用ifgoto完成所有這些,但是你的意圖將被埋沒在更多的語法和狀態跟蹤之下。

我經常使用mapgrep 並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM