Perl复杂正则表达式使用嵌套表达式进行搜索和替换

时间:2016-02-24 03:19:00

标签: regex perl replace

我有以下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声明可能有一个,两个或更多,即。可能有d7d8(在我的代码中显示),或者可能是(d7d8d9d10,{ {1}} ....)似乎我必须将它们存储到某种临时变量中以帮助替换,但我不知道如何在d11正则表达式中使用它。我希望我能在不对原始代码进行彻底改革的情况下做到这一点。

有没有人有任何建议?提前谢谢〜

1 个答案:

答案 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 ;

感谢您查看; - )