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