Perl несколько регулярных выражений соответствия по нескольким строкам - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь собрать несколько совпадений в группе строк в текстовом файле.

Данные принимают множество форм, таких как

AO22_X1N_A9PP96CTS_C24 SYN_INC_187 (.A0 (test_so6), .A1 (n2218) , .B0 (U_PAUSEdata_ff_int_28_), .B1 (n2), .Y (n2597));

NAND3_X1R_A9PP96CTUL_C16 SYN_INC_154 (.A (n1563), .B (U_PAUSEwcnt), .C (n1640), .Y (n1467));

Первая часть - это имя. Возможно, захочу ТАТ позже, но сейчас я заинтересован в портах ex .A (нетто) В идеале я хочу захватить все имена входных сетей (с именами A, B, C, D и т. Д.) И один выход .Y (net)

В конце концов я хочу сохранить их в хеш-коде, где выходная сеть - это ключ, а данные - ссылка на массив входных данных, но сейчас я просто пытаюсь получить все входные сети для захвата.

Это то, с чем я сейчас работаю

open (FILE, "<maca") or die("Can not open $file");
  while (defined(my $cur_line = <FILE>)) {

    if ($cur_line =~ m/[A-Z].*?\.[A-C]\d* \( (.*?) \).*?;/mg) { 
      print "THIS gate $cur_line $1 $2 $3\n";  
      }
  }

Я пытаюсь для этого дисплея

ЭТИ ворота NAND3_X1R_A9PP96CTUL_C16 SYN_INC_154 (.A (n1563), .B (U_PAUSEwcnt), .C (n1640), .Y (n1467));

n1563 U_PAUSEwcnt n1640

Но я понял. На самом деле меня не волнует первая строка, только вторая. Первый для отладки. Я думал, что m будет искать несколько строк, а g будет глобально соответствовать многострочной строке. Чего мне не хватает

ЭТО вентиль .B (U_PAUSEwcnt), .C (n1640), .Y (n1467));

n1640

1 Ответ

0 голосов
/ 13 марта 2019

Если я вас правильно понимаю, вы ищете что-то вроде этого:

while ($data =~ /(\w+)\s*\((.+?)\)\s*;/gm) {
  my $line = $1;
  my $vals = $2;
  while ($vals =~ /\.(\w+)\s*\(\s*(\w+)\s*\)/g) {
    print "$line .. $1: $2.\n"
  }
}

Я назвал переменную $data, поскольку в ней есть все строки - правильно?Сначала я разделяю строки, захватывая строку между ( .. ), а затем вытаскиваю пары ключ-значение.Похоже, что все имена буквенно-цифровые + "_", которые хорошо фиксируются за \w.

Надеюсь, это поможет?

...