Was hälst Du von folgendem Code:
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
37
38
39
40
41
42
#!/usr/bin/perl
use strict;
use warnings;
my @file = ('Negation :;',
'Object_Ground:;Object ',
'Object_Plant :Color Position;Object',
' Test 1 : Blubb Bla;;;;;Test;;;;::',
);
for my $zeile (@file) {
chomp $zeile;
print "Zeile '$zeile'\n";
my ($vorn, $mitte, $hinten) = $zeile =~ m~^([^:]*):([^;]*);(.*)$~;
for ($vorn, $mitte, $hinten) { $_ = '' unless defined; }
s~^\s+|\s+$~~g for ($vorn, $mitte, $hinten);
print "\tvorn : '$vorn'\n\tmitte : '$mitte'\n\thinten: '$hinten'\n";
if (length($vorn) and length($mitte) and length($hinten)) {
print "\tFall3: relframe und Ueberklasse\n";
if ($mitte =~ m~\s~) {
print "\tMitte enthaelt mehrere Werte. (Fall 4)\n";
my @mwerte = split /\s+/, $mitte;
print "\tDiese Werte sind: '", (join "', '", @mwerte), "'\n";
}
}
elsif (length($vorn) and length($mitte)) {
print "\tFall1: relframe aber keine Ueberklasse\n";
}
elsif (length($vorn) and length($hinten)) {
print "\tFall2: keine relframe aber Ueberklasse\n";
}
elsif (length($vorn)) {
print "\t<\\frame_entry>\n";
}
else {
print "\tFEHLER\n";
}
}
mit der Ausgabe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Zeile 'Negation :;'
vorn : 'Negation'
mitte : ''
hinten: ''
<\frame_entry>
Zeile 'Object_Ground:;Object '
vorn : 'Object_Ground'
mitte : ''
hinten: 'Object'
Fall2: keine relframe aber Ueberklasse
Zeile 'Object_Plant :Color Position;Object'
vorn : 'Object_Plant'
mitte : 'Color Position'
hinten: 'Object'
Fall3: relframe und Ueberklasse
Mitte enthaelt mehrere Werte. (Fall 4)
Diese Werte sind: 'Color', 'Position'
Zeile ' Test 1 : Blubb Bla;;;;;Test;;;;::'
vorn : 'Test 1'
mitte : 'Blubb Bla'
hinten: ';;;;Test;;;;::'
Fall3: relframe und Ueberklasse
Mitte enthaelt mehrere Werte. (Fall 4)
Diese Werte sind: 'Blubb', 'Bla'
Das hat den Vorteil, dass Du nur eine RE zur Analyse des Strings (und Säuberungs-RE's) hast und die Analyse dann über die ermittelten Werte laufen lässt. Das geht schneller und ist übersichtlicher, finde ich. Die Basis-Regel zum Zerlegen hab ich hier ganz einfach gehalten:
m~^([^:]*):([^;]*);(.*)$~
Die drei farbig markierten Klammern fangen die drei in Frage kommenden Teile ein:
Alles vom Anfang bis zum ersten Doppelpunkt,
alles vom ersten Zeichen nach dem ersten Doppelpunkt bis zum ersten folgenden Semikolon,
alles vom ersten Zeichen nach diesem Semikolon bis zum Ende der Zeile.
Mit
for ($vorn, $mitte, $hinten) { $_ = '' unless defined; }
s~^\s+|\s+$~~ for ($vorn, $mitte, $hinten);
wird dann noch etwas nachbehandelt (undef durch Leerstring ersetzt und führende oder folgende Leerzeichen eliminiert).
Die Nachfolgende Analyse (in der if-elsif-else Kaskade) arbeitet dann nur noch mit den drei ermittelten Variablen.\n\n
<!--EDIT|Crian|1091617852-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite