Thread String einlesen und nachfolgendes Wort ausgeben
(20 answers)
Opened by SCORRPiO at 2014-04-15 10:15
Wie Muffi schon sagt: Schleifentyp.
Dir fällt vielleicht auf, dass Du in Deinem if-elsif eigentlich immer die gleichen Schritte ausführst. Ein Ansatz wäre da, die Suchmuster in einem Array zu hinterlegen, das ist übersichtlicher/wartbarer und einfach zu erweitern (ungetestet): 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 25 26 27 28 29 30 31 32 33 34 35 36 use strict; use warnings; my @Zeilen = (""); my $status = 3; # Wenn kein Status dann 3 (UNKNOWN) my @knownTypes = qw( ONLINE RESYNC_IN_PROGRESS MISSING OUT_OF_SYNC OFFLINE ); my $typeRegExp = join( '|', @knownTypes ); $typeRegExp = qr/ \b $typeRegExp \b /x; # RegExp nur einmal kompilieren open( my $dataFH, '<', 'test4' ) or die "Datei nicht gefunden\n"; ZEILE: while ( my $zeile = <$dataFH> ) { if ( $zeile =~ / \b OPTIMAL \b /x ) { exit 0; # <--- Wirklich Programm beenden? next ZEILE; # oder nächste Zeile? } if ( $zeile =~ /$typeRegExp/ ) { my ($phy) = $zeile =~ / \b phy \s+ (\w+) /x; my ($state) = $zeile =~ / \b state \s+ (\w+) /x; my ($flags) = $zeile =~ / \b flags \s+ (\w+) /x; print "phy: $phy, state: $state, flags: $flags\n"; next ZEILE; } print "UNKNOWN\n"; } close( $dataFH ); Das Beispiel verwendet auch lexikalische Filehandles (klare Empfehlung), außerdem habe ich die unnötigen /g-Modifier entfernt. btw: Wolltest Du beim ersten 'OPTIMAL' tatsächlich aus dem Programm aussteigen? Ach ja, in Perl brauchst Du nicht immer printf(), einfaches print() geht auch und spart wertvolle Buchstaben ... Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
|