alle backrefs in s//
am 10.07.2006 18:10:21 von eck
Hallo allesamt,
mit @matches = ( $string =~ /muster/ ) kann man ja sehr schön alle
Treffer in ein array kriegen.
Ich will das aber jetzt bei einem substitute an eine zu evaluierende
Funktion übergeben, also sowas ind er Art von
$string =~ s/m(us)(te)r/Function($1,$2)/e
wobei ich $1,$2 nicht einzeln aufführen will, sondern hier nur gerne ein
(e Referenz auf ein) Array aller Treffer übergeben würde, also
$string =~ s/m(us)(te)r/Function(@ALLMATCHES)/e
Ich habe das Problem, dass mein s/// zwei bis 32 backrefs finden kann,
die dann an die zu evaluierende Function übergeben wwerden sollen, und
es ist einfach mistig zu lesen, wenn im regexp Function($1,$2,...,$32)
steht. ;-)
Ich hoffe ich habe mich klar genug ausgedrückt ;-)
--
B.Eckstein, eck@ivu.de Cheap, Fast, Good - pick any two of them
Die FAQ zu de.comp.hardware.netzwerke: http://how.to/dchn
Mozilla-Tips: http://mozilla-anleitung.de/ http://www.holgermetzger.de/
Re: alle backrefs in s//
am 10.07.2006 19:00:44 von Andreas Seltenreich
"B.Eckstein" writes:
> Ich habe das Problem, dass mein s/// zwei bis 32 backrefs finden kann,
> die dann an die zu evaluierende Function übergeben wwerden sollen, und
> es ist einfach mistig zu lesen, wenn im regexp Function($1,$2,...,$32)
> steht. ;-)
Hmm, wäre ein Makro vielleicht die Lösung? Aus dem Regexp bekäme man
die Parameter damit:
use Filter::cpp;
#define ALLMATCHES [$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]
$string =~ s/m(us)(te)r/Function(ALLMATCHES)/e
HTH
Andreas
Re: alle backrefs in s//
am 10.07.2006 19:28:04 von Frank Wiegand
Andreas Seltenreich schrieb:
>> Ich habe das Problem, dass mein s/// zwei bis 32 backrefs finden kann,
>> die dann an die zu evaluierende Function übergeben wwerden sollen, und
>> es ist einfach mistig zu lesen, wenn im regexp Function($1,$2,...,$32)
>> steht. ;-)
> use Filter::cpp;
> #define ALLMATCHES [$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]
> $string =~ s/m(us)(te)r/Function(ALLMATCHES)/e
$string =~ s/m(us)(te)r/"Function ".join",",map"\$$_",1..32/ee;
Golf anyone?
Frank
Re: alle backrefs in s//
am 10.07.2006 21:35:49 von eck
Frank Wiegand schrub im Jahre 10.07.2006 19:28:
> Andreas Seltenreich schrieb:
>>> Ich habe das Problem, dass mein s/// zwei bis 32 backrefs finden kann,
>>> die dann an die zu evaluierende Function übergeben wwerden sollen, und
>>> es ist einfach mistig zu lesen, wenn im regexp Function($1,$2,...,$32)
>>> steht. ;-)
>> use Filter::cpp;
>> #define ALLMATCHES [$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]
>> $string =~ s/m(us)(te)r/Function(ALLMATCHES)/e
>
> $string =~ s/m(us)(te)r/"Function ".join",",map"\$$_",1..32/ee;
Hm, auch wenn mir Andreas' Lösung, da eben nicht allgemein gültig, nicht
wirklich gefällt, ist das aber immer noch besser les- und wartbar als
Deine. Und ein eval weniger. Die hat aber widerum den Charme, dass sie
kein define braucht.
Na, ich warte mal, ob noch schönere Ideen auftauchen. ;-)
Danke einstweilen euch beiden.
--
B.Eckstein, eck@ivu.de Cheap, Fast, Good - pick any two of them
Die FAQ zu de.comp.hardware.netzwerke: http://how.to/dchn
Mozilla-Tips: http://mozilla-anleitung.de/ http://www.holgermetzger.de/
Re: alle backrefs in s//
am 10.07.2006 22:14:52 von jzei
Am 10.07.2006 18:10 schrieb B.Eckstein:
> $string =~ s/m(us)(te)r/Function($1,$2)/e
>
> wobei ich $1,$2 nicht einzeln aufführen will, sondern hier nur gerne ein
> (e Referenz auf ein) Array aller Treffer übergeben würde, also
>
> $string =~ s/m(us)(te)r/Function(@ALLMATCHES)/e
Hallo,
dann wirst Du wohl vor diesem Substitute @ALLMATCHES zum Beispiel mit:
my @ALLMATCHES = $string=~/m(us)(te)r/g;
füllen müssen.
MfG, Jörg
Re: alle backrefs in s//
am 10.07.2006 22:30:32 von Frank Wiegand
B.Eckstein schrieb:
>>> $string =~ s/m(us)(te)r/Function(ALLMATCHES)/e
>> $string =~ s/m(us)(te)r/"Function ".join",",map"\$$_",1..32/ee;
> Na, ich warte mal, ob noch schönere Ideen auftauchen. ;-)
$string = $` . Function($string =~ /m(us)(te)r/) . $';
Das performt aber alles in Grund und Boden.
Frank
Re: alle backrefs in s//
am 11.07.2006 08:30:02 von eck
Joerg schrub im Jahre 10.07.2006 22:14:
> Hallo,
> dann wirst Du wohl vor diesem Substitute @ALLMATCHES zum Beispiel mit:
>
> my @ALLMATCHES = $string=~/m(us)(te)r/g;
>
> füllen müssen.
Das klappt nicht. Wenn in $string "m(us)(te)r" mehrfach auftaucht, dann
beinhaltet @ALLMATCHES mehrfach wechselweise 'us','te'. Das ist dann die
Function nicht mehr zu gebrauchen, wenn man das subst global macht. Ich
will ja als Parameter für Function nur die Backrefs des jeweiligen Matches.
--
B.Eckstein, eck@ivu.de Cheap, Fast, Good - pick any two of them
Die FAQ zu de.comp.hardware.netzwerke: http://how.to/dchn
Mozilla-Tips: http://mozilla-anleitung.de/ http://www.holgermetzger.de/
Re: alle backrefs in s//
am 11.07.2006 08:32:08 von eck
Frank Wiegand schrub im Jahre 10.07.2006 22:30:
> B.Eckstein schrieb:
>>>> $string =~ s/m(us)(te)r/Function(ALLMATCHES)/e
>>> $string =~ s/m(us)(te)r/"Function ".join",",map"\$$_",1..32/ee;
>> Na, ich warte mal, ob noch schönere Ideen auftauchen. ;-)
>
> $string = $` . Function($string =~ /m(us)(te)r/) . $';
>
> Das performt aber alles in Grund und Boden.
Eben. Deswegen will ich das alles eigentlich nicht.
Das also bei den regexps sowas wie ein @ALLMACHES nicht vorhanden zu
sein scheint (ich hab' auch nix auf dev.perl.org dazu gefunden), werde
ich wohl oder übel mein Function($1,$2,$3,...$32) stehen lassen.
Danke an alle für's Denken.
--
B.Eckstein, eck@ivu.de Cheap, Fast, Good - pick any two of them
Die FAQ zu de.comp.hardware.netzwerke: http://how.to/dchn
Mozilla-Tips: http://mozilla-anleitung.de/ http://www.holgermetzger.de/
Re: alle backrefs in s//
am 11.07.2006 09:41:43 von jzei
BEckstein schrieb:
> Joerg schrub im Jahre 10.07.2006 22:14:
>
> > Hallo,
> > dann wirst Du wohl vor diesem Substitute @ALLMATCHES zum Beispiel mit:
> >
> > my @ALLMATCHES =3D $string=3D~/m(us)(te)r/g;
> >
> > füllen müssen.
>
> Das klappt nicht. Wenn in $string "m(us)(te)r" mehrfach auftaucht, dann
> beinhaltet @ALLMATCHES mehrfach wechselweise 'us','te'. Das ist dann die
> Function nicht mehr zu gebrauchen, wenn man das subst global macht. Ich
> will ja als Parameter für Function nur die Backrefs des jeweiligen Matc=
hes.
Hallo,
dann mußt Du das halt in eine Schleife packen
$string=3D~s/m(us)(te)r/F(@ALL)/e while @ALL=3D$string=3D~/m(us)(te)r/;
Jörg
Re: alle backrefs in s//
am 11.07.2006 12:34:52 von eck
Joerg schrub im Jahre 11.07.2006 09:41:
> dann mußt Du das halt in eine Schleife packen
> $string=~s/m(us)(te)r/F(@ALL)/e while @ALL=$string=~/m(us)(te)r/;
Ja, das sollte klappen. Dann wird der subst aber nicht 1x global sondern
@ALL-mal gerufen. Dürfte auch nicht gut performen.
Ich glaub' ich lasse es, wie es ist
--
B.Eckstein, eck@ivu.de Cheap, Fast, Good - pick any two of them
Die FAQ zu de.comp.hardware.netzwerke: http://how.to/dchn
Mozilla-Tips: http://mozilla-anleitung.de/ http://www.holgermetzger.de/
Re: alle backrefs in s//
am 11.07.2006 14:39:39 von Frank Wiegand
B.Eckstein schrieb:
>> $string = $` . Function($string =~ /m(us)(te)r/) . $';
>> Das performt aber alles in Grund und Boden.
> Eben. Deswegen will ich das alles eigentlich nicht.
Es gibt ja noch Perl 6:
#!/usr/bin/perl5
use Perl6::Rules;
$string =~ s{ @::m := [m(us)(te)r] }{ $( Function(@{$::m[0]}) ) };
__END__
Oder so ähnlich. Aber das performt wahrscheinlich auch (noch) nicht.
Frank