我有以下Perl代码(摘自更长的代码):
use strict;
use warnings;
my %hash_all_dffs = (d6 => "1", d7 => "1", d8 => "1", d9 => "1");
#print %hash_all_dffs;
my $search = join( "|", map {quotemeta} keys %hash_all_dffs);
$search = qr/\b($search)\b/;
#print $search;
# read all lines at once
$/ = "";
# read inline text and process
while (<DATA>) {
# search for match pattern, do replacement
$_ =~ s/(?:module.*?\(.*?\)\s*;)(*SKIP)(*F)|\breg\b\s*(\[\s*\d+\s*\:\s*\d+\s*\])?(\s*\b$search\b\s*,)*?\s*\b$search\b\s*;
/ my $tmp4 = $&;
my $tmp50 = $&;
my $tmp51 = $&;
my $tmp52 = $&;
$tmp4 =~ s,\n,\n\/\/,gs;
$tmp50 =~ s,($search),$2_tmr0,gs;
$tmp51 =~ s,($search),$2_tmr1,gs;
$tmp52 =~ s,($search),$2_tmr2,gs;
"\/\/".$tmp4."\n".$tmp50."\n".$tmp51."\n".$tmp52."\n"
/gesx;
print;
}
__DATA__
reg [1:0] d7 ,
d8 ;
输出如下:
//reg [1:0] d7 ,
// d8 ;
reg [1:0] d7_tmr0 ,
d8_tmr0 ;
reg [1:0] d7_tmr1 ,
d8_tmr1 ;
reg [1:0] d7_tmr2 ,
d8_tmr2 ;
到目前为止一直很好(可能很丑,但是&gt; _&lt;)。
我的意图: 我想在输出的末尾添加一些额外的文本,新的东西就像(Verilog TMR冗余代码):
assign d7_tmrvote = (d7_tmr0 & d7_tmr1) | (d7_tmr0 & d7_tmr2) | (d7_tmr1 & d7_tmr2);
assign d8_tmrvote = (d8_tmr0 & d8_tmr1) | (d8_tmr0 & d8_tmr2) | (d8_tmr1 & d8_tmr2);
如果原始文本中只声明了一个reg
(即只有d7
或仅d8
),那么相当简单(仍然但是,丑陋地做我想做的事。
问题:但是,让我烦恼的问题是,reg
声明可能有一个,两个或更多,即。可能有d7
和d8
(在我的代码中显示),或者可能是(d7
,d8
,d9
,d10
,{ {1}} ....)似乎我必须将它们存储到某种临时变量中以帮助替换,但我不知道如何在d11
正则表达式中使用它。我希望我能在不对原始代码进行彻底改革的情况下做到这一点。
有没有人有任何建议?提前谢谢〜
答案 0 :(得分:1)
最终设法自己做;但Perl代码有点难看:
use strict;
use warnings;
my %hash_all_dffs = (d6 => "1", d7 => "1", d8 => "1", d9 => "1");
#print %hash_all_dffs;
my $search = join( "|", map {quotemeta} keys %hash_all_dffs);
$search = qr/\b($search)\b/;
#print $search;
# read all lines at once
$/ = "";
# read inline text and process
while (<DATA>) {
# search for match pattern, do replacement
$_ =~ s/(?:module.*?\(.*?\)\s*;)(*SKIP)(*F)|\breg\b\s*(\[\s*\d+\s*\:\s*\d+\s*\])?(\s*\b$search\b\s*,)*?\s*\b$search\b\s*;
/ my $tmp4 = $&;
my $tmp50 = $&;
my $tmp51 = $&;
my $tmp52 = $&;
my $tmp6 = $&;
my $tmp9 ;
$tmp4 =~ s,\n,\n\/\/,gs;
$tmp50 =~ s,($search),$2_tmr0,gs;
$tmp51 =~ s,($search),$2_tmr1,gs;
$tmp52 =~ s,($search),$2_tmr2,gs;
my @list_tmr_reg = ( $tmp6 =~ m,$search,gs );
foreach(0..$#list_tmr_reg) {
my $tmp7 = $list_tmr_reg[$_];
my $tmp8 = "${tmp7}_vote = ( ${tmp7}_tmr0 & ${tmp7}_tmr1 ) | ( ${tmp7}_tmr0 & ${tmp7}_tmr1 ) | ( ${tmp7}_tmr0 & ${tmp7}_tmr1 );";
$tmp9 = $tmp9.$tmp8;
}
"\/\/".$tmp4."\n".$tmp50."\n".$tmp51."\n".$tmp52."\n".$tmp9
/gesx;
print;
}
__DATA__
reg [1:0] d7 ,
d8 ;
感谢您查看; - )