可以在 perl 中使用 map 的 next 吗?

mil*_*bos 3 arrays perl loops map-function

我想只解析标题名称main.c

#include "foo.h"
#include "bar.h"
#include <stdio.h>

int add(int a,int b){ return a+b; }
int sub(int a, int b){ return a-b; }

int main(){
    printf("%i\n",add(1,2));
}
Run Code Online (Sandbox Code Playgroud)

所以我的 perl 脚本如下所示:

#!/usr/bin/perl 
open MAIN, $ARGV[0];

@ar = map { /#include "([^"]+)"/ ? $1 : next } <MAIN>;

#this one works (next inside for-loop, not map-loop)
for(<MAIN>){
    if(/#include "([^"]+)"/){
        push @ar2, $1;
    } else {
        next;
    }
}

print "@ar\n";
print "@ar2\n";
Run Code Online (Sandbox Code Playgroud)

给出错误:

Can't "next" outside a loop block 
Run Code Online (Sandbox Code Playgroud)

那么有next可能map吗?如果是这样,如何解决我的问题?

ike*_*ami 8

的给定迭代map可以返回任意数量的标量,包括零。

my @ar = map { /#include "([^"]+)"/ ? $1 : () } <MAIN>;
Run Code Online (Sandbox Code Playgroud)

与列表上下文中的捕获匹配的匹配返回匹配的捕获文本,而失败的匹配则不返回任何内容。如此,上述可以简化。

my @ar = map { /#include "([^"]+)"/ } <MAIN>;
Run Code Online (Sandbox Code Playgroud)

  • 您还可以链接“地图”。`map { abs_path($_) } map { /#include "([^"]+)"/ }` (4认同)
  • `/#include "([^"]+)"/ ?abs_path($1) : ()` (3认同)