[Bielefeld-pm] (kein Betreff)

taulmarill at xgn.de taulmarill at xgn.de
Mi Jul 29 01:24:30 PDT 2009


Mahlzeit,

und ich hatte doch recht :-)

Mit Perl 5.10 gibt es die Möglichkeit mit \g{n} einen Buffer anzusprechen,
wenn n positiv ist, funktioniert das genau so wie \n. Also \g{1} ist
gleich \1. Wenn n aber negativ ist, läuft das relativ zur aktuellen
Position:

/
    (Y) # buffer 1
    ( # buffer 2
        (X) # buffer 3
        \g{-1} # backref to buffer 3
        \g{-3} # backref to buffer 1
    )
/x

Das müsste doch eigentlich genau das tun, was Nils wollte. Außerdem gibt
es auch die Möglichkeit capture buffers zu benennen. Schaut euch einfach
mal hier http://perldoc.perl.org/perlre.html den Abschnitt "Capture
buffers" an.

Wie gesagt, das ganze funktioniert erst mit Perl >= 5.10, aber so was ist
ja schnell kompiliert.


Gruß,
Jürgen

Am Mi, 29.07.2009, 09:41, schrieb c.duehl at gmx.de:
> Guten Morgen,
>
> ich hab versucht, Nils RE-Problem irgendwie nachzubauen, um eine Lösung zu
> basteln.
>
> Neben der mit den Doppelten REs (fangend / nicht fangend) von gestern,
> gäbe es noch die Möglichkeit, sich Stückchenweise vorzuarbeiten, oder aber
> den bisherigen Ausdruck zu nutzen und einen zweiten Test nachzulagern.
>
> So nach dem Motto
>
> if (my @treffer = m~schwierige RE~) {
>     my $n = @treffer;
>     if ($treffer[$n-1] eq $treffer[$n-3]) {
>         # eigentliche Behandlung hier
>     }
> }
>
>
>
> Ich komme allerdings gar nicht so weit. Vermutlich ist mein Beispiel nicht
> komplex genug. Ich poste es trotzdem mal:
>
>
> [code]
> #!/usr/bin/perl
> use strict;
> use warnings;
>
> my $re_param =
>     qr~[\w]+
>        \s*
>        =
>        \s*
>        ['"]?
>        [^'"<>]+
>        ['"]?
>        \s*
>      ~x;
>
> while (<DATA>) {
>     chomp;
>     print "zeile $.: $_\n";
>     my @werte =
>         m~<
>             (ELEMENT|A)
>             (?:
>               \s+
>               ((?:$re_param\s*)+)
>             )?
>           >
>           (
>             (?:
>               (?!</\1>).
>             )*
>           )
>           </\1>
>          ~gx;
>     for my $w (@werte) {
>         print "    ", (defined $w ? $w : '---'), "\n";
>     }
> }
>
>
> __DATA__
> erste zeile <ELEMENT var1='wert1' var2="wert2">Inhalt</ELEMENT> mitte <A
> var3='wert3'><i>bla</i></A> Rest
> zweite zeile <ELEMENT var1='wert1' var2="wert2">Inhalt
> <i>irgendwelcher</i> Art</ELEMENT> Rest
> dritte zeile <ELEMENT var1='wert1'>Inhalt irgendwelcher Art</ELEMENT> Rest
> vierte zeile <ELEMENT var1=wert1>Inhalt irgendwelcher Art</ELEMENT> Rest
> fuenfte zeile <ELEMENT>Inhalt irgendwelcher Art</ELEMENT> Rest
> [/code]
>
> Ergebnis:
>
> [code]
> zeile 1: erste zeile <ELEMENT var1='wert1' var2="wert2">Inhalt</ELEMENT>
> mitte <A var3='wert3'><i>bla</i></A> Rest
>     ELEMENT
>     var1='wert1' var2="wert2"
>     Inhalt
>     A
>     var3='wert3'
>     <i>bla</i>
> zeile 2: zweite zeile <ELEMENT var1='wert1' var2="wert2">Inhalt
> <i>irgendwelcher</i> Art</ELEMENT> Rest
>     ELEMENT
>     var1='wert1' var2="wert2"
>     Inhalt <i>irgendwelcher</i> Art
> zeile 3: dritte zeile <ELEMENT var1='wert1'>Inhalt irgendwelcher
> Art</ELEMENT> Rest
>     ELEMENT
>     var1='wert1'
>     Inhalt irgendwelcher Art
> zeile 4: vierte zeile <ELEMENT var1=wert1>Inhalt irgendwelcher
> Art</ELEMENT> Rest
>     ELEMENT
>     var1=wert1
>     Inhalt irgendwelcher Art
> zeile 5: fuenfte zeile <ELEMENT>Inhalt irgendwelcher Art</ELEMENT> Rest
>     ELEMENT
>     ---
>     Inhalt irgendwelcher Art
> [/code]
>
> Gruß Christian
> _______________________________________________
> Bielefeld-pm mailing list
> Bielefeld-pm at pm.org
> http://mail.pm.org/mailman/listinfo/bielefeld-pm
>




Mehr Informationen über die Mailingliste Bielefeld-pm