【发布时间】:2019-03-08 21:29:09
【问题描述】:
我正在努力尝试在文本文件的一组行中捕获多个匹配项。
数据有很多形式,比如
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));
第一部分是一个名字。以后可能想要 tat 但现在我对端口 ex .A (net) 感兴趣 理想情况下,我想捕获所有输入网络名称(具有 A、B、C、D 等的网络名称)和单个输出 .Y(网络)
最终我想将它们存储到一个散列中,其中输出网络是键,数据是输入数组的引用,但现在我只是想捕获所有输入网络。
这就是我目前正在使用的东西
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
【问题讨论】:
-
如果
$cur_line是单行,则不应使用多行正则表达式。尝试在没有g和m修饰符的情况下匹配单个正则表达式中的三个字段 -
使用 Verilog 解析器:metacpan.org/pod/Verilog-Perl
-
@Håkon Hægland 它实际上是一个文件中的多行。多行数据由 ; 终止
-
@toolic 我不知道有一个verilog解析器。感谢您指出了这一点。我会看看是否可以拉入综合网表。我可能会使用它,或者只是从模块中窃取代码。只想要一个简单的测试脚本。无需将整个设计拉入内存
-
vhier辅助脚本可能是一个不错的起点。
标签: regex perl multilinestring