Thread Verschachtelte Struktur extrahieren
(0 answers)
Opened by MarkusH at 2012-09-19 09:59
Hallo,
ich habe folgende Datei gegeben: ;FOLD PTP VB=10% VE=0% ACC=100% RobWzg=1 Base=0 SPSTrig=0[1/100s] P;%{P}%MKUKATPVW,%CMOVE8,%VPTP,%P 1:1, 2: VB=, 3:10, 4:%, 5: VE=, 6:0, 7:%, 8: ACC=, 9:100, 10:%, 11: RobWzg=, 12:1, 13: Base=, 14:0, 15: SPSTrig=, 16:0, 17:[1/100s], 18: P, 19:0, 20:-1, 21:1 ;FOLD 1: A15 = EIN;%{SE}%MKUKATPVW %CVW_SPS %VBOASG %P 2:A15 = EIN,3: BOASG ;ENDFOLD ;FOLD 2: SPSMAKRO0 = EIN;%{SE}%MKUKATPVW %CVW_SPS %VMAKRO %P 2:SPSMAKRO0 = EIN,3: MAKRO ;ENDFOLD ;FOLD 3: -- Warte auf Start --;%{SE}%MKUKATPVW %CVW_COM %VCOMMENT %P 2: -- Warte auf Start --,3: VW_COMMENT ;ENDFOLD ;FOLD {H} SPS_FERTIG=FALSE INTERRUPT DECL 10 WHEN $CYCFLAG[254]==FALSE DO VW(#FB_STOP,TRUE) INTERRUPT ON 10 INT10=TRUE VW(#VW_INIT,TRUE) VW_USR_R (#USR_INIT) TRIGGER WHEN DISTANCE=1 DELAY=-0.1 DO P0_MERKER=TRUE VW_MPARA_ACT=P0_D Act_P1 = P0 Act_P2 = P0 VW(#MPARA,TRUE) SPS_FERTIG=FALSE TRIGGER WHEN DISTANCE=1 DELAY=0 DO SPS_TRIG(1) PRIO=-1 PTP P0 $ADVANCE=1 WAIT FOR SPS_FERTIG ;ENDFOLD ;ENDFOLD ; FOLD Warte auf Start ;%{SE}%MKUKATPVW,%C,%V VW (#VW_AUE_WAIT,TRUE ) IF N_VW==TRUE THEN GOTO PEXIT ENDIF ;ENDFOLD ;FOLD -- FOLGE11 -- ;%{PSE}%MKUKATPVW,%CVW_COM,%VCOMMENT,%P 1:Comment:, 2: FOLGE11 ;FOLD {H} M_COMMENT("FOLGE11") ;ENDFOLD ;ENDFOLD ;FOLD -- --------------------------------------- -- ;%{PSE}%MKUKATPVW,%CVW_COM,%VCOMMENT,%P 1:Comment:, 2: --------------------------------------- ;FOLD {H} M_COMMENT("---------------------------------------") ;ENDFOLD ;ENDFOLD ;FOLD -- UP aufruf -- ;%{PSE}%MKUKATPVW,%CVW_COM,%VCOMMENT,%P 1:Comment:, 2: UP aufruf ;FOLD {H} M_COMMENT("UP aufruf") ;ENDFOLD ;ENDFOLD Der obige Block kann innerhalb der Datei mehrmals in abgewandelter Form vorkommen. Mir geht es darum, immer einen solchen Block aus der Datei zu extrahieren und in einer eigenen Sub dann weiter zu verarbeiten. ich habe jetzt folgenden Ansatz gewählt: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 sub processSrcFile { my $robot = shift; my @src = @_; my @tmp = (); my $foldCounter = 0; foreach my $line (@src) { if ($line =~ /^\s*;\s*FOLD\s+[PTP|K?LIN|K?CIRC]/i) { @tmp = (); $foldCounter = 1; } if ($line =~ /^\s*;\s*FOLD\s+[\d+|{H}]/i) { $foldCounter++; } if ($line =~ /^\s*;\s*ENDFOLD/i) { $foldCounter--; if ($foldCounter == 0) { # rufe sub zur Weiterverarbeitung auf } } push @tmp, $line; } } Obiger Code funktioniert soweit. Aber ginge das nicht eleganter? Evtl. mit Flip-Flop-Operator. $q =~ /(bb|[^b]{2})/
|