2016-03-02 30 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

谢谢,那工程 –