Ну, во-первых, вы применяете команду regexp
к списку, что не совсем рекомендуется. Как сейчас, вы можете обойтись без использования regexp
, например так:
set filename_reverse_mapper "sram.sv"
# Read in the data; this is good even for pretty large files
set f_3 [open $filename_reverse_mapper]
set lines_3 [split [read $f_3] "\n"]
close $f_3
set match [lsearch -all -inline $f_3 "input wire *"]
# {input wire a;} {input wire ef;} {input wire gh;}
Оттуда вы можете зациклить и извлечь список ввода:
set input [lmap n $match {string map {";" ""} [lindex [split $n] end]}]
# a ef gh
РЕДАКТИРОВАТЬ:Что касается вашего редактирования, то поиск по регулярному выражению будет более подходящим из-за потенциальных пробелов:
set input [lsearch -all -inline -regexp $lines_3 {^ *input wire .*}]
Хотя вы можете использовать одно регулярное выражение для всего файла:
set filename_reverse_mapper "sram.sv"
# Read in the data; this is good even for pretty large files
set f_3 [open $filename_reverse_mapper]
set lines_3 [read $f_3]
close $f_3
set allMatches [regexp -inline -all -lineanchor {^(?:in|out)put wire ([^;]+);$} $lines_3]
# {input wire a;} a {input wire ef;} ef {input wire gh;} gh {output wire c;} c {output wire d;} d {output wire fin;} fin
set inputs [lmap {m n} $allMatches {if {[string match "input*" $m]} {set n} else continue}]
# a ef gh
set outputs [lmap {m n} $allMatches {if {[string match "output*" $m]} {set n} else continue}]
# c d fin
В приведенном выше регулярном выражении используются ^
и $
, которые обычно соответствуют началу и концу строки соответственно, но с -lineanchor
соответствует началу и концу строки в строке соответственно. ([^;]+)
просто «захватывает» все, что не является точкой с запятой. -inline
заставляет regexp
возвращать фактические совпадения (в противном случае мы получаем количество совпадений), а -all
заставляет его искать все возможные совпадения (а не просто останавливаться на первом совпадении).