[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