簡體   English   中英

簡化perl map和grep

[英]simplifying perl map and grep

我需要在某個集合的所有行中找到一個特定的子文本,而我最終得到了這一點:

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

哪個工作正常。 但是開始時的那個grep(在不發生匹配時消除所有的emty行)看起來很可怕。

有沒有更干凈的方法可以做到這一點?

為了澄清,這是示例輸入和沒有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

在地圖中返回()不會在輸出中添加任何元素,因此您可以使用三元條件

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

但是m/...(...).../已經在比賽中返回了一個非空列表,否則返回了一個空列表,所以我想你可以說

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

我認為您可以通過在未找到匹配項時返回空列表來在map處理所有問題:

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

這不等於簡單一些:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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