Thread Verschachtelte Struktur extrahieren (0 answers)
Opened by MarkusH at 2012-09-19 09:59

MarkusH
 2012-09-19 09:59
#161925 #161925
User since
2012-04-08
161 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe folgende Datei gegeben:
more (1.8kb):

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

View full thread Verschachtelte Struktur extrahieren