[求助!!!]perl编程达人能帮帮小弟吗 谢谢了~

[求助!!!]perl编程达人能帮帮小弟吗 谢谢了~

小弟有个作业要编写一个perl语言的程序,把这个下面这个格式的程序,
module add(in1,in2,c_in,out,c_out);
input  in1,in2,c_in;output  out,c_out;
wire    N0,N1,N2,N3,N4;
   GTECH_XOR2    C6(.A(in1),.B(in2),.Z(N0));
   GTECH_XOR2    C7(.A(N0),.B(c_in),.Z(out));
   GTECH_OR2     C8(.A(N3),.B(N4),.Z(c_out));
   GTECH_OR2     C9(.A(N1),.B(N2),.Z(N3));
   GTECH_AND2    C10(.A(c_in),.B(in2),.Z(N1));
   GTECH_AND2    C11(.A(c_in),.B(in1),.Z(N2));
   GTECH_AND2    C12(.A(in1),.B(in2),.Z(N4));
endmodule
变成这种格式               
.subckt      add      in1  in2  c_in  out  c_out
    C6    in1    in2   N0     XOR2
    C7    N0     c_in  out    XOR2
    C8    N3     N4    c_out   OR2
    C9    N1     N2     N3     OR2
    C10   c_in   in2    N1     AND2
    C11   c_in   in1    N2     AND2
    C12   in1    in2    N4     AND2
.ENDS      add                                 
我是想按句转换的,用模式匹配来完成,高手指点下。谢谢大虾了~


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

use strict;
use warnings;

my $mod_name;

while (<DATA>) {
    chomp;
        if (/\bmodule\b/) {
            my @temp = m{
                        (\w+)
                             \s+
                        (\w+)
                        \(
                        (\w+),(\w+),(\w+),(\w+),(\w+)
                        \);
                }x;
                $temp[0] = '.subckt';
                                $mod_name = $temp[1];
                print "$_ " for @temp;
                print "\n";
        } elsif (/GTECH/) {
                my @temp = m{
                        GTECH_(\w+)
                        \s+
                        (C\d+)
                        \(\.A\((\w+)\),
                          \.B\((\w+)\),
                          \.Z\((\w+)\)
                        \);
                }x;
                push @temp, shift @temp;
                print "$_ " for @temp;
                print "\n";
        } elsif (/endmodule/) {
            print ".ENDS      $mod_name\n";
        }
}

__DATA__
module add(in1,in2,c_in,out,c_out);
input  in1,in2,c_in;output  out,c_out;
wire    N0,N1,N2,N3,N4;
GTECH_XOR2    C6(.A(in1),.B(in2),.Z(N0));
GTECH_XOR2    C7(.A(N0),.B(c_in),.Z(out));
GTECH_OR2     C8(.A(N3),.B(N4),.Z(c_out));
GTECH_OR2     C9(.A(N1),.B(N2),.Z(N3));
GTECH_AND2    C10(.A(c_in),.B(in2),.Z(N1));
GTECH_AND2    C11(.A(c_in),.B(in1),.Z(N2));
GTECH_AND2    C12(.A(in1),.B(in2),.Z(N4));
endmodule

>perl -w test.pl
.subckt add in1 in2 c_in out c_out
C6 in1 in2 N0 XOR2
C7 N0 c_in out XOR2
C8 N3 N4 c_out OR2
C9 N1 N2 N3 OR2
C10 c_in in2 N1 AND2
C11 c_in in1 N2 AND2
C12 in1 in2 N4 AND2
.ENDS      add
>Exit code: 0

学习Perl中,拿来练手......

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w

use strict;

open(FH,"data.txt") || die "can't open file!$!";

while(<FH>)
{
  $_ = ~s/^module\s(\w+)\((\w+),(\w+),(\w+),(\w+),(\w+)\);/
             .subckt\t$1\t$2\t$3\t$4\t$5\t$6/;  
  $_ = ~s/^(i|w).*//s;
  $_ = ~s/\w+_(\w+)\s+(\w\d+)\(\.\w\((\w+)\),\.\w\((\w+)\),\.\w\((\w+)\)\);/
             $2\t$3\t$4\t$5\t$1/;
  $_ = ~s/^endmodule/.ENDS \t add/;
  print;
}

close(FH);