Можно ли использовать следующий внутри карты в perl? - PullRequest
3 голосов
/ 02 августа 2020

Я хотел бы разобрать только имя заголовка в 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));
}

Итак, мой 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";

дает ошибку:

Can't "next" outside a loop block 

так возможно ли next в map? если да, то как исправить мой случай?

1 Ответ

8 голосов
/ 03 августа 2020

Данная итерация map может возвращать любое количество скаляров, включая ноль.

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

Сопоставление с захватами в контексте списка возвращает захваченный текст при совпадении и ничего при неудачном совпадении. Таким образом, приведенное выше можно упростить.

my @ar = map { /#include "([^"]+)"/ } <MAIN>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...