Schrift
[thread]6453[/thread]

Pattern Matching: Probleme Muster zu erstellen (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
renee
 2004-08-04 13:22
#85286 #85286
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Der Aufruf von substr ist folgender:

substr(LANGER_STRING, START_POSITION, LAENGE);

Man merke: es ist die Länge nicht die Stopposition!

weiteres siehe perldoc -f substr
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
peggy
 2004-08-04 13:44
#85287 #85287
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
Oh! AHHHHHHHHHHHHH ;) Jetzt versteh ich warum das nich ging. Irgendwie war ich der Überzeugung, dass es die stoppposition is ;)

Das mit den Mustern geht jetzt teilweise. Ich brauch die substr trotzdem nioch, von daher DANKE :)
Ich habe noch das Problem, dass ein Muster dem anderen sehr ähnelt. Beispiel:
Move :Actor Position ;Task ## fahren
Hier stehen zwischen : und ; zwei Wörter anstatt nur eins oder keins. Für eins hab ich ja folgendes Muster:
~ m!^ *([\w_]+) *: *([\w_]+)*; *$!
Wie kann ich das in einem neuen Fall umformulieren für mehrere Wörter mit Leerzeichen getrennt. Egal was ich versuche, es is nicht richtig, weil er dann alles als das anerkennt :( Das mit den Muster is noch kruder als in JAVA...SO! HILFE!
peggy
 2004-08-04 13:46
#85288 #85288
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
axo kennt jemand ne vernünftigeseite zu Pattern Matching in Deutsch mit Musterübungen oder so...irgendwie bin ich zu blöd dazu :laugh:
Crian
 2004-08-04 13:47
#85289 #85289
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
m~^\s*([^:]+)\s*:\s*([^;]+)\s*;\s*$~\n\n

<!--EDIT|Crian|1091613319-->
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
Crian
 2004-08-04 13:48
#85290 #85290
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=peggy,04.08.2004, 11:46]axo kennt jemand ne vernünftigeseite zu Pattern Matching in Deutsch mit Musterübungen oder so...irgendwie bin ich zu blöd dazu :laugh:[/quote]
"Reguläre Ausdrücke" von Jeffrey E. F. Friedl (O'Reilly)

Aus dem Wiki: http://www.gcf.de/directdl.php?id=73&dl=papers/perl-regex.tar (keine Ahnung ob das gut und auf Deutsch ist, hab ich mir noch nicht angesehen).\n\n

<!--EDIT|Crian|1091613183-->
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
renee
 2004-08-04 13:50
#85291 #85291
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ersetz das das zweite [\w_]+ durch [^\;]+

Hier meine Lösungen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /usr/bin/perl

use strict;
use warnings;

my $string = 'Object_Plant :Color Position;Object';

#Loesung 1 --> RegEx
{
$string =~ /^\s*?([^\:]+)\:\s*?([^\;]+)\s*?\;\s*?(.+)/;
print $1," -> ",$2," -> ",$3,"\n";
}

#Loesung 2 --> substr
{
my $pos_dp = index($string,':');
my $pos_sk = index($string,';');
my $part_one = substr($string,0,$pos_dp);
my $part_two = substr($string,($pos_dp + 1),($pos_sk - $pos_dp - 1));
my $part_three = substr($string,($pos_sk + 1));
print $part_one," -> ",$part_two," -> ",$part_three,"\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2004-08-04 13:54
#85292 #85292
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Ich finde die \w's eh ziemlich überfllüssig, siehe meinen Lösungsvorschlag oben...
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
peggy
 2004-08-04 14:25
#85293 #85293
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
ich habs jetzt vervollständigt...grmpf....der weißt falsche muster zu! muss an der reihenfolge liegen oder? Hier Die Musterbeispiele
Fall 0=Object : ;
Fall 1=Measure_Quantity :Object ;
Fall 2=Hindering : ;Object
Fall 3=Move_in_place : Object ;Task
Fall 4=Object_Plant :Color Position ;Object
Fall 5=Definite :Object Gesture ;

Code: (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
if($element =~ m!^ *([\w_]+) *: *; *$!)#keine relframe,keine überklasse
{
print '<\frame_entry>',"\n";
}
elsif($element =~ m!^ *([\w_]+) *: *([\w_]+)*; *$!)#relframe aber keine Überklasse
{
print "Fall1:relframe aber keine Überklasse\n";
}
elsif($element =~ m!^ *([\w_]+) *: *;*([\w_]+) * $! )#kein relframe aber überklasse
{
print "Fall2:keine relframe aber Überklasse\n";
}

elsif($element =~ m!^ *([\w_]+) *: *([\w_]+)*; *([\w_]+) * $!)#relframe und überklasse
{
print"Fall3:relframe und überklasse\n";
}
elsif($element =~ m!^ *([\w_]+) *: *[^\;]+ *; * $!)#mehrere relframes, keine überklasse
{
print "Fall4: mehrere relframes, keine überklasse\n";
}

elsif($element =~ m!^ *([\w_]+) *: *[^\;]+ *; *([\w_]+) * $!)#mehrere relframes,überklasse
{
print "Fall5: mehrere relframes,überklasse\n";
}
else {print "FEHLER\n";}
Crian
 2004-08-04 14:50
#85294 #85294
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Was hälst Du von folgendem Code:

Code: (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
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

Code: (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
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

Code: (dl )
1
2
    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
peggy
 2004-08-04 15:17
#85295 #85295
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
AHHHHHHHH! DAnkedankedanke Crian *freu*
Ich programmier erst seid einer Woche in Perl von daher....meine güte muss ich noch viel lernen. wußte garnicht, dass man einfach so my() bei der initialisierung/zuweisung schreiben kann, dachte, dass muss man oben schreiben. Is natürlich tausendmal besser deine Lösung. Und dann einfach so schnell ma geschrieben *neid*:blush: :D
P.S. jetzt versteh ich wozu ^ gut is. Habs immer für unsinnig gehalten und dumm angestarrt\n\n

<!--EDIT|peggy|1091618524-->
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2004-08-03 16:11.