2016-04-27 5 views
1

Ich lese eine ähnliche Frage an (How can I print all the lines between the previous and next empty lines when a match is found?)! und versuchte, alle Zeilen zwischen leeren Zeilen zu drucken, aber es wird nicht gedruckt. Hier ist das Skript, das ich ausprobiert habe, bitte korrigieren Sie es, um für meine Anforderung zu arbeiten.Perl-Skript zum Drucken von Zeilen zwischen leeren Zeilen

my @file = <IN>; 
for (0 .. $#file) { 
if ($file[$_] =~ /Match/){ 
    my $start = $_; 
    while ($start >= 0 && $file[$start] !~ /^$/) { 
     $start--; # $start points to first empty line 
    } 
    my $end = $_; 
    while ($end <= $#file && $file[$end] !~ /^$/) { 
     $end++; # $end points to next empty line 
    } 
print OUT "\[email protected][$start+1..$end-1]"; #it should print between two empty lines right?? 
} 
} 

Eingabedatei:

wire enable,GSMC_G8,mkf_g,un1_G11_0, GND_net_1, VCC, G8, G16, Q_RNIUQAA,  CK_c, reset_c, 
    G0_c, G1_c, G17_c, G2_c, G3_c, G17_c_i, GND_1, VCC_0; 

INBUF G3_pad (.PAD(G3), .Y(G3_c)); 
dff_0_1 DFF_1 (.G17_c(G17_c), .reset_c(reset_c), .CK_c(CK_c), 
    .G0_c(G0_c), .G8(G8)); 
GND GND_i_0 (.Y(GND_1)); 
NOR2 G3_pad_RNIUUQF (.A(G8), .B(G3_c), .Y(G16)); 
INV G17_pad_RNO (.A(G17_c), .Y(G17_c_i)); 
VCC VCC_i (.Y(VCC)); 
CLKBUF CK_pad (.PAD(CK), .Y(CK_c)); 

endmodule 

Ausgabedatei benötigt:

INBUF G3_pad (.PAD(G3), .Y(G3_c)); 
dff_0_1 DFF_1 (.G17_c(G17_c), .reset_c(reset_c), .CK_c(CK_c), 
    .G0_c(G0_c), .G8(G8)); 
GND GND_i_0 (.Y(GND_1)); 
NOR2 G3_pad_RNIUUQF (.A(G8), .B(G3_c), .Y(G16)); 
INV G17_pad_RNO (.A(G17_c), .Y(G17_c_i)); 
VCC VCC_i (.Y(VCC)); 
CLKBUF CK_pad (.PAD(CK), .Y(CK_c)); 
+1

Fügen Sie bitte eine Beispiel-Eingabedatei und die gewünschte Ausgabe ein. Sie können Ihre Frage bearbeiten. – simbabque

+0

Verwenden Sie bitte auch "strict" und "use warnings". In Ihrem Code gibt es mehrere Syntaxprobleme. Mathematische Operatoren werden nicht in Strings interpoliert. Ihre 'print'-Anweisung tut nicht das, was Sie denken. – simbabque

+0

Um Verilog zu analysieren: https://metacpan.org/pod/Verilog-Perl – toolic

Antwort

1

ein flip-flop operator verwenden.

#!/usr/bin/perl 
use warnings; 
use strict; 

while (<DATA>) { 
    # Turn flip-flop on at the first empty line 
    # And then off at the next empty line 
    if (/^$/ ... /^$/) { 
    # Ignore the two empty lines 
    next unless /\S/; 
    print; 
    } 
} 

__DATA__ 
wire enable,GSMC_G8,mkf_g,un1_G11_0, GND_net_1, VCC, G8, G16, Q_RNIUQAA,  CK_c, reset_c, 
    G0_c, G1_c, G17_c, G2_c, G3_c, G17_c_i, GND_1, VCC_0; 

INBUF G3_pad (.PAD(G3), .Y(G3_c)); 
dff_0_1 DFF_1 (.G17_c(G17_c), .reset_c(reset_c), .CK_c(CK_c), 
    .G0_c(G0_c), .G8(G8)); 
GND GND_i_0 (.Y(GND_1)); 
NOR2 G3_pad_RNIUUQF (.A(G8), .B(G3_c), .Y(G16)); 
INV G17_pad_RNO (.A(G17_c), .Y(G17_c_i)); 
VCC VCC_i (.Y(VCC)); 
CLKBUF CK_pad (.PAD(CK), .Y(CK_c)); 

endmodule 

habe ich die DATA Dateihandle hier verwendet es einfach, zu zeigen, zu machen, was passiert. Es ist einfach, dies gegen ein anderes Dateihandle auszutauschen.

+0

Ich habe das gleiche versucht, es funktioniert nicht .... es gibt leere Datei aus ... –

+1

Wenn Sie sagen "Ich habe das gleiche versucht" Was genau hast du getan? –

+0

Bedeutet, ich habe versucht, Flipflops zwischen leeren Zeilen zeigen. –

Verwandte Themen