2016-03-02 82 views
1

我有一個條件,找出潛臺詞的特定部分,在一些集中的所有行,我已經結束了與此:簡化perl的地圖和grep

my @missing = grep { $_ ne '' } map { $1 if m/^prefix:\s+(.+):\s+suffix$/ } @lines; 

工作正常。但是在開始的時候(爲了在比賽沒有發生時擺脫所有的情緒線)看起來很可怕。

有沒有更乾淨的方式做到這一點?

只是爲了澄清,我這裏是輸入和輸出我得到沒有的grep:

my @lines = (
    'drivel', 
    'prefix: matches: suffix', 
    'stuff', 
    'prefix: more: suffix' 
); 

my @selected = map { $1 if m/^prefix:\s+(.+):\s+suffix$/ } @lines; 
print "found: $_\n" foreach @selected; 

輸出想要的東西:

found: matches 
found: more 

輸出與上面得到:

found: 
found: matches 
found: 
found: more 
+0

你的輸入是什麼,你想達到什麼輸出?可能這可以通過grep或sed單獨完成。 –

+1

只是'@missing = map /^prefix:\s+(.+):\s+suffix$/,@ lines'應該有你想要的效果。但我無法想象'@ lines'中的值會導致'map'返回一個空字符串。你可以顯示你的數據樣本嗎? – Borodin

回答

8

在地圖返回()沒有任何元素添加到輸出,所以你可以使用三元條件像

my @missing = map { m/^prefix:\s+(.+):\s+suffix$/ ? $1 :() } @lines; 

m/...(...).../已經返回上一個匹配否則空單一個非空列表,所以我覺得你可以說

my @missing = map { m/^prefix:\s+(.+):\s+suffix$/ } @lines; 
+0

哦,所以它。那很棒。謝謝 –

0

是不是等於簡單:

my @missing = grep /./, map { $1 if m/^prefix:\s+(.+):\s+suffix$/ } @lines; 
+0

是的,但我想以某種方式避免grep。 –

3

我想你可以處理這一切在短短map通過返回空列表時沒有找到匹配:

my @missing = map { /^prefix:\s+(.+):\s+suffix$/ ? $1 :() } @lines; 
+0

謝謝,那工程 –