MudGuard: Regexp: Verkürzung möglich?

Hi,

ich hab mal eine Frage zu Regulären Ausdrücken (in Perl).

Ich hab Zeilen, die wie folgt aufgebaut sind:

MARKER-feld0-<feld1>-<feld2>-<feld3>-<feld4>-someotherstuff

Feld 0 kann niemals ein - enthalten.
Jedes der Felder feld1 bis feld4 kann entweder der String "<none>" (ohne die Quotes) sein oder aber Text, in dem weder < noch > vorkommt.

Ok, das zu matchen und zu zerlegen ist nicht das Problem:

if (m/MARKER-([^-]*)-<(<none>|[^>]*)>-<(<none>|[^>]*)>-<(<none>|[^>]*)>-<(<none>|[^>]*)>-(hierzeugszummatchenundzerlegenvonsomeotherstuff)/)  
{  
 my $feld0 = $1; # remember the parts, as $1... will be overwritten later on ...  
 my $feld1 = $2;  
 my $feld2 = $3;  
 my $feld3 = $4;  
 my $feld4 = $5;  
}

Jetzt kommt in dem Ausdruck ja viermal (bzw. bei mehr Feldern noch öfter) der gleiche Teil vor - kann man das irgendwie kürzer schreiben?

mit

if ($teststring =~ m/MARKER-([^-]*)-(?:<(<none>|[^>]*)>-){4}/)

funktioniert es leider nicht - der Ausdruck matcht zwar, $feld0 ist korrekt gefüllt, $feld1 enthält den Inhalt des letzten Feldes und die Zuweisungen für die Felder 2 bis 4 erzeugen eine Warnung:

Use of uninitialized value in concatenation (.) or string at test.pl line 17

Gibt es einen anderen (und schönen ;-)) Weg außer der Aufteilung per split, mit dem das funktioniert, ohne das man zigmal denselben Teil schreibt?
split hat den Nachteil, daß ich erstmal prüfen müßte, ob die Zeile matcht, dann Anfang, Mittelteil und Ende spezialbehandeln müßte.

Schöner wär's halt, wenn ich das alles mit dem einen match erschlagen könnte. Gibt es da was, was ich nicht kenne oder an das ich mich grade nicht erinnern kann?

Eine Änderung des Zeilenformats ist leider nicht möglich.

TIA,
cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  1. Hi,

    Jetzt kommt in dem Ausdruck ja viermal (bzw. bei mehr Feldern noch öfter) der gleiche Teil vor - kann man das irgendwie kürzer schreiben?

    kürzer _schreiben_ kann man es - durch Verwendung von Variablen. Effektiv bleibt die RegExp dann natürlich genauso lang. Nach meinem Verständnis der Materie ist eine "echte" Verkürzung über ...

    if ($teststring =~ m/MARKER-([^-]*)-(?:<(<none>|[^>]*)>-){4}/)

    ... hinaus nicht möglich. Du kannst den Code halt lesbarer machen, das ist aber schon alles.

    split hat den Nachteil, daß ich erstmal prüfen müßte, ob die Zeile matcht, dann Anfang, Mittelteil und Ende spezialbehandeln müßte.

    Auch das ginge mit einer zweiten RegExp. Ob das der Wartbarkeit zuträglich ist, wage ich jedoch zu bezweifeln.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Jetzt kommt in dem Ausdruck ja viermal (bzw. bei mehr Feldern noch öfter) der gleiche Teil vor - kann man das irgendwie kürzer schreiben?
      kürzer _schreiben_ kann man es - durch Verwendung von Variablen.

      Ok, die Verkürzung bezieht sich dann aber auf das Zeug, das für ein Feld nötig ist, aber auch mit
      $f = qr/<(<none>|[^>]*)>-/;
      muß ich immer noch m/MARKER-([^-]*)-$f-$f-$f-$f schreiben, ich kann also immer noch keinen Quantifier dafür nutzen, also
      m/MARKER-([^-]*)-(?:$f){4} bringt immer noch das "falsche" Resultat.

      Effektiv bleibt die RegExp dann natürlich genauso lang. Nach meinem Verständnis der Materie ist eine "echte" Verkürzung über ...

      if ($teststring =~ m/MARKER-([^-]*)-(?:<(<none>|[^>]*)>-){4}/)
      ... hinaus nicht möglich.

      Was ja leider nicht identisch ist, da die $2, $3 usw. anders bzw. gar nicht belegt werden.

      Du kannst den Code halt lesbarer machen, das ist aber schon alles.

      Schade ...

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.