linux-l: alle __doc__ aus einem Pythonmodul?
Jens Dreger
dreger at physik.fu-berlin.de
Sa Nov 6 20:53:10 CET 1999
On Sat, 6 Nov 1999, Susanne Schmidt wrote:
> Apropos eval.. ;)
>
> > Ich hab jetzt eine Lösung, "eval" ist das Zauberwort....
>
> Man stelle sich vor: Eine Datei, die lauter Perl-Skalare/Arrays enthält.
> Eine Art Template. Diese Datei moechte ich in ein Script einlesen, die
> Scalare durch ihren Wert ersetzen und printen/als Datei neu schreiben.
>
> Wie man das mit Reg Ex macht, weiss ich - aber wie geht sowas mit eval ??
> Ich war bisher zu blöd fuer eval und suche noch das ultimative Beispiel
> zum verstehen der höheren Perl-Weihen ;)
Hi Susanne !
Nun, ich glaub(t)e, das geht gar nicht mit eval. Eval(string) fuehrt ja
den gesamten string als Perl-Programm aus, und das willst Du glaube ich
nicht. Wenn ich Dich richtig verstanden habe, dann willst Du ungefaher
sowas wie in folgendem Beispiel:
--file data.tmpl---8<------
VALUE1=$value1
ARRAY1=@array1
DO_SOMETHING
-------------------8<------
Dann kann man mittels replace.pl ala
------------------------------8<----------------------
#!/usr/bin/perl -w
$value1="val1";
@array1= ( 'a[1]', 'a[2]', 'a[3]', 'a[4]' );
while(<>) {
s/(\$\w+)/$1/eeg;
s/(\@\w+)/$1/eeg;
print;
}
----------------------------8<---------------------
alle Variablen ersetzen (dachte ich...)
Doch siehe da, was passiert ?
root> replace.pl data.tmpl
VALUE1=val1
ARRAY1=4
DO_SOMETHING
Die Zeile s/(\@\w+)/$1/eeg; funktioniert nicht, weil $1 in Scalar Context
ausgewertet wird. Es nuetzt auch nichts, dies duch
s/(\@\w+)/join(' ',$1)/eeg; zu ersetzen, was mich wundert, weil join
eigentlich einen Array Context fordern sollte. Nach ein bischen
Herumprobieren mit Referenzen (als mit Tauben auf Spatzen schiessen...)
habe ich folgende Loesung gefunden:
s/(\@\w+)/eval("join(' ',$1)")/eg
Und da ist es, das (explizite) eval. Man erhaelt:
----------------------
VALUE1=val1
ARRAY1=a[1] a[2] a[3] a[4]
DO_SOMETHING
----------------------
wie gewuenscht. Nur werden Arrays jetzt immer mit " " verbunden. Man kann
natuerlich beim join ein anderes Zeichen nehmen, aber es gilt dann immer
fuer das ganze Template.
Falls jemand weiss, wie man bei s/(\@\w+)/join(" ",$1)/eeg; ein Array
Context erzwingen kann, teile er/sie es mir doch bitte mit.
Gruss,
Jens.
Mehr Informationen über die Mailingliste linux-l