2 Stimmen

Identifikation von dynamischen Listenpunkten

Ich versuche, Daten aus einer Liste zu identifizieren, der Code ist:

my $listdata = '
Listeneinträge:     
(1)LIST 1 Daten 
(a)Unterdaten
(b)Unterdaten
(c)Unterdaten
(d)Unterdaten
    (i)Unter-Unterdaten
    (ii)Unter-Unterdaten
        (A)Unter-Unter-Unterdaten
        (B)Unter-Unter-Unterdaten
    (iii)Unter-Unterdaten
(e)Unterdaten
(2)LIST 2 Daten 
(3)LIST 3 Daten 
';

    #print "\n\n\n$listdata\n\n";

    ###Array von mehrstufigen Mustern 
    my @level_check =('\(\d+\)','(?is Ist: $first_level\n";
            }
        }

        for($i=0; $i>$2$3};
                #print"**$data level matched: $leveltemp => $first_level\n";
                ############Erste Stufe Beenden
            }
            else
            {
                ######Zweite Stufe Start
                if($leveltemp !~ /^(?:<>|\d{3,}\,?|\([a-h]{3,})/i){
                    $second_occur = $leveltemp if !$second_occur;
                    #print "$leveltemp :$second_occur\n";

                    for($i=0; $iis IInd: $second_level\n";
                        }
                    }

                    if($leveltemp =~ /^$second_level/){
                        $leveltemp =~ s{$pattern}{<>$2$3};
                        #print"**level matched: $leveltemp => $seconf_level\n";
                        ######Zweite Stufe End
                    }
                    else
                    {
                        ########Dritte Stufe Start   
                        if($leveltemp !~ /^(?:<>|\d{3,}\,?|\([A-h]{3,})/i){
                            $third_occur = $leveltemp if !$third_occur;

                            for($i=0; $iis IIIrd: $third_level\n";
                                }
                            }

                            if($leveltemp =~ /^$third_level/){
                                $leveltemp =~ s{$pattern}{<>$2$3};
                                #print"**level matched: $leveltemp => $third_level\n";
                            #########Dritte Stufe Ende
                            }
                            else
                            {
                                ########Vierte Stufe Start  
                                if($leveltemp !~ /^(?:<>|\d{3,}\,?|\([A-z]{3,})/i){

                                    $fourth_occur = $leveltemp if !$fourth_occur;
                                        #print "$leveltemp :$fourth_occur\n";
                                    for($i=0; $iis IVrth: $fourth_level\n";
                                        }
                                    }

                                    if($leveltemp =~ /^$fourth_level/){
                                        $leveltemp =~ s{$pattern}{<>$2$3};
                                        #print"**$fourth_occur  level matched: $leveltemp => $fourth_level\n";
                                        #########Vierte Stufe Ende
                                    }
                                    #######Nächste Stufen hier hinzufügen, falls vorhanden, im else-Loop

                                }
                            }#IV lvl else loop end
                        }   
                    }#III lvl else loop end
                }
            }#IInd lvl else loop end

        }#Ist lvl for loop end

        "$leveltemp"
    }gsixe;

print "$listdata\n";

Das erforderliche Ergebnis:

 <>(1)LIST 1 Daten 
 <>(a)Unterdaten
 <>(b)Unterdaten
 <>(c)Unterdaten
 <>(d)Unterdaten
 <>(i)Unter-Unterdaten
 <>(ii)Unter-Unterdaten
 <>(A)Unter-Unter-Unterdaten
 <>(B)Unter-Unter-Unterdaten
 <>(iii)Unter-Unterdaten
 <>(e)Unterdaten
 <>(2)LIST 2 Daten 
 <>(3)LIST 3 Daten

Das Problem ist, dass ich für jede Stufe Code eingeben muss. Ich habe hier bis zu vier Stufen codiert. Aber das ist keine Lösung (Die Liste kann beliebig viele Unterstufen haben). Gibt es einen anderen Weg, um einen kurzen Code dafür zu schreiben, der alle möglichen Unterstufen der Liste abdeckt? Nochmal, die Liste ist dynamisch. Die Liste kann in einem der folgenden Formate starten: A) (A) 1. 1) (1) a) (a) i) (i).

1voto

ikegami Punkte 340842

Verwenden Sie einen Stapel, um "geöffnete" Stile zu verfolgen, um festzustellen, ob ein neuer Stil ein Kind oder ein Elternteil ist.

use strict;
use warnings;

my @styles = (
    '\(\d+\)',     '\d+\)',     '\d+\.',
    '\([a-h]\)',   '[a-h]\)',   '\([A-H]\)',   '[A-H\)',
    '\([IVX]+\)',  '[IVX]+\)',  '\([ivx]+\)',  '[ivx]+\)',
    '-',
);

my @stack;
while (<>) {
   for my $i (reverse 0..$#stack) {
      if (/$stack[$i]/) {
         splice(@stack, $i+1);
         goto DONE_LINE;
      }
   }

   for my $style (@styles) {
      if (my ($spaces) = /^( *)$style/) {
         push @stack, qr/^$spaces$style/;
         goto DONE_LINE;
      }
   }

   die "Unrecognized format at line $. - $_";

DONE_LINE:
   s/^ *//;
   printf("<<LIST%d>>%s", 0+@stack, $_);
}

Um das erneute Kompilieren der gleichen Regex-Muster immer wieder zu vermeiden, fügen Sie hinzu

my %re_cache = map { $_ => qr/^( *)$_/ } @styles;

und ändern Sie

/^( *)$style/

zu

/$re_cache{$style}/

0voto

Miller Punkte 34837

Probieren Sie, Zeile für Zeile zu verarbeiten. Folgendes identifiziert auf welcher Ebene sich jedes der Listenelemente befindet. Man müsste einfach den vorherigen Stand verfolgen, um festzustellen, ob etwas ein Kind ist, und den maximalen Wert für jede vorherige Ebene beibehalten, um zu überprüfen, dass die Dinge in der richtigen Reihenfolge sind:

use strict;
use warnings;

###Array der mehrstufigen Muster
my @level_check = (
    '\(\d+\)',
    '(?) {
    chomp(my $line = $_);

    my $match = 0;
    for my $i (0..$#level_check) {
        if ($line =~ /^\s*$level_check[$i]/) {
            $match = $i + 1;
            last;
        }
    }

    if ($match) {
        print "Ebene $match - $line\n";
    } else {
        print "Keine Übereinstimmung - $line\n";
    }
}

1;

__END__
(1)LIST 1 Daten
(a)Unterdaten
(b)Unterdaten
(c)Unterdaten
(d)Unterdaten
    (i)Unter-Unterdaten
    (ii)Unter-Unterdaten
        (A)Unter-Unter-Unterdaten
        (B)Unter-Unter-Unterdaten
    (iii)Unter-Unterdaten
(e)Unterdaten
(2)LIST 2 Daten
(3)LIST 3 Daten

druckt

Ebene 1 - (1)LIST 1 Daten
Ebene 3 - (a)Unterdaten
Ebene 3 - (b)Unterdaten
Ebene 3 - (c)Unterdaten
Ebene 3 - (d)Unterdaten
Ebene 10 -     (i)Unter-Unterdaten
Ebene 10 -     (ii)Unter-Unterdaten
Ebene 5 -         (A)Unter-Unter-Unterdaten
Ebene 5 -         (B)Unter-Unter-Unterdaten
Ebene 10 -     (iii)Unter-Unterdaten
Ebene 3 - (e)Unterdaten
Ebene 1 - (2)LIST 2 Daten
Ebene 1 - (3)LIST 3 Daten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X