2016-02-24 87 views
-1

我有Perl代碼如下(從一個較長的代碼摘錄):所以Perl的複雜的正則表達式搜索和替換嵌套表達式

//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 ; 

到目前爲止:

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 ; 

輸出是下面的文字好(也許醜陋,但> _ <)。

我的意圖: 我想在輸出的末尾添加一些額外的文本,而新的東西就像是(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(顯示在我的代碼中),或者可能是(d7d8,d9,d10, d11 ....)。似乎我將不得不將它們存儲到某種臨時變量來幫助替換,但我不知道如何在s///gsex正則表達式。我希望我能做到這一點,而不必對原始代碼進行大修改。

有沒有人有任何建議?在此先感謝〜

回答

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 ; 

感謝觀看;-)