Schrift
[thread]5630[/thread]

Code, der Code erzeugt und verwendet: geht das?



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Crian
 2003-08-18 15:26
#61743 #61743
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Also, ich stelle mir folgendes vor: Im BEGIN-Block eines Moduls - nennen wir es A - lasse ich (abhängig von einer Konfigurationsdatei) Code generieren. Diesen Code möchte ich dann mit use / require / eval / hastdunichtgesehen einlesen.

In diesem erzeugten Code sollen Funktionen bereitgestellt werden, die ich dann in dem Modul A, das sie erzeugt hat, verwenden will.

Hat jemand sowas schonmal gemacht oder eine Idee / Ratschläge dazu?

Ich hab noch keine eigenen Gehversuche unternommen, denn ich befürchte Schwierigkeiten, da use xyz ja zur Kompilationszeit ausgeführt wird. Dann wird eventuell immer nur der im vorigen Schritt erzeugte Kram angezogen, oder?

Bei eval sehe ich das Problem, dass zu dem Zeitpunkt ja nur Funktionen zur Verfügung gestellt werden sollen und noch kein eigentlicher Code ausgeführt werden soll.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
snadra
 2003-08-18 15:31
#61744 #61744
User since
2003-08-11
265 Artikel
BenutzerIn
[Homepage] [default_avatar]
Heute morgen war auf Perlmonks ein Thread zum Thema subroutinen innehalb des Code erzeugen. Vielleicht wäre das ganz hilfreich:
Da:
http://www.perlmonks.org/index.pl?node_id=284415
http://hamburg.pm.org
jeden 2. mittwoch im monat
--
#!/usr/bin/perl -w
$l=join('',map chr,(116,110,105,114,112))if$^T;
!!$$?@_=qw(Jhfg Aabgure Prey Hnpxre):$l=1;
for(@_){eval reverse($l)."'"._(_(_($_))).' \''}
sub _{$_=~y+a-z+n-za-m+and pop}
Crian
 2003-08-18 15:36
#61745 #61745
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Danke, das sieht auf den ersten Blick schonmal sehr vielversprechend aus :)
Wenn ich eine passende Lösung finde, stell ich sie hier vor.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2003-08-18 15:44
#61746 #61746
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Wie es aussieht - ich entnehme es jedenfalls der Antwort von G.Warde - kann ich im Begin-Block doch ein Modul erzeugen, und es danach mit use einbinden.

Das sieht dann etwa so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
BEGIN {
   open(F, ">Modul.pm")  or die "Unable to create Modul.pm:$!";
   print F "sub machdies { ... }\n";
   print F "sub machdas  { ... }\n";
   print F "1;\n";
   close(F) or die "Unable to close Modul.pm:$!";
}

use Modul;

wobei ich denke, dass das untere "use Modul;" auch über dem Beginblock stehen kann.

Ich werd mal anfangen, etws entsprechendes in mein Modul einzubauen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
snadra
 2003-08-18 15:49
#61747 #61747
User since
2003-08-11
265 Artikel
BenutzerIn
[Homepage] [default_avatar]
Bin mal gespannt...
http://hamburg.pm.org
jeden 2. mittwoch im monat
--
#!/usr/bin/perl -w
$l=join('',map chr,(116,110,105,114,112))if$^T;
!!$$?@_=qw(Jhfg Aabgure Prey Hnpxre):$l=1;
for(@_){eval reverse($l)."'"._(_(_($_))).' \''}
sub _{$_=~y+a-z+n-za-m+and pop}
pktm
 2003-08-18 15:54
#61748 #61748
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hört sich nach Skynet aus Terminator an :D
http://www.intergastro-service.de (mein erstes CMS :) )
Crian
 2003-08-18 16:11
#61749 #61749
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Es klappt, aber das use muss wirklich unter dem BEGIN-Block stehen...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2003-08-18 16:16
#61750 #61750
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Bei mir sieht es jetzt so aus (noch um FindBin aufgebrezelt, damit das neue "Modul" (naja ...) nicht in allen Verzeichnissen erstellt wird, aus denen ein Programm aufgrufen wird, welches mein Modul nutzt):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BEGIN {
   ...
   open(F, ">$FindBin::Bin/Modul.pm")
       or die "Unable to create Modul.pm:$!";
   print F "sub machdies { print \"machdies\\n\" }\n";
   print F "sub machdas  { print \"machdas\\n\"  }\n";
   print F "1;\n";
   close(F) or die "Unable to close Modul.pm:$!";

} # BEGIN


use FindBin;
use lib $FindBin::Bin;
use Modul;


Irgendwo im normalen Programmablauf kann ich dann etwa

Code: (dl )
machdas();

aufrufen und erhalte die entsprechende Ausgabe.

Nun mache ich mich daran, und fülle die Funktionen (umbenannt) mit sinnvollem Inhalt... aber das müsste dann ja auch gehen.

... ich berichte ;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2003-08-18 16:18
#61751 #61751
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
warum nicht einfach den code generieren und dann ein eval()
machen? das mit dem modul erzeugen hört sich so umständlich
und unnötig an.
eval $code;
Modulname->import( 'was auch immer du importieren willst' );


ansonsten evtl. auch <!--cpan1--><a href="http://search.cpan.org/search?query=%22Class::Meth..." target="_blank">CPAN: <!--cpan2--><!--cpan3--></a><!--cpan4-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2003-08-18 16:31
#61752 #61752
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Es geht auch noch so:

Code: (dl )
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
33
package A;

...

use FindBin;
use lib $FindBin::Bin;

...

machdas();

...

sub _create_module {
   open(F, ">$FindBin::Bin/Modul.pm")
       or die "Unable to create Modul.pm:$!";
   print F "sub machdies { print \"machdies\\n\" }\n";
   print F "sub machdas  { print \"machdas\\n\"  }\n";
   print F "1;\n";
   close(F) or die "Unable to close Modul.pm:$!";
}

...

BEGIN {
   ...
   A::_create_module();
} # BEGIN


use Modul;

return 1;
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2003-08-18 15:26.