Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11848[/thread]

Verstänisproblem in Sachen 'use'



<< >> 8 Einträge, 1 Seite
Gast Gast
 2008-05-20 17:49
#110015 #110015
Hallo,
ich hab da ein deutliches Verständnisproblem.

Wenn ich schreibe ...
Code: (dl )
1
2
3
4
5
6
7
    $_config->{'foo'} == 1 && do {

my $bar = sub {
use BAZ;
[...]
};
};

wird dann das Modul BAZ bereits zur Compilezeit geladen oder erst dann wenn ich $bar->() aufrufe?

Danke für Eure Antworten.
pq
 2008-05-20 17:52
#110016 #110016
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
use wird immer zur compilezeit geladen. wenn du das nicht willst, musst du require nehmen.
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
moritz
 2008-05-20 18:38
#110021 #110021
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Gast Gast
 2008-05-20 18:55
#110022 #110022
pq+2008-05-20 15:52:02--
use wird immer zur compilezeit geladen. wenn du das nicht willst, musst du require nehmen.

Auch wenn es (wie hier) in einer Referenz auf eine anonyme Subroutine steckt?
Gast Gast
 2008-05-20 18:57
#110023 #110023
moritz+2008-05-20 16:38:13--
oder eval.

Wie meinst du das?
Muß ich den Code der Subroutine in ein EOF (oder qq) packen?
sid burn
 2008-05-20 19:22
#110024 #110024
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
Auch wenn es (wie hier) in einer Referenz auf eine anonyme Subroutine steckt?

Ja...
Der Sourcecode wird vor der ausführung geparsed und in bytecode umgewandelt. Machst du ein BEGIN { ... } Block irgendwohin dann wird dieser Block immer direkt nach der Umwandlung zu Bytecode ausgeführt. Sprich immer noch zur Compilierzeit. Ein use Statement ist entspricht "fast" einem BEGIN { ... } Block um einem "require" Befehl.

Die Subroutine selber wird damit aber nicht ausgeführt.

Quote
Wie meinst du das?
Muß ich den Code der Subroutine in ein EOF (oder qq) packen?

Was soll ein EOF sein?

Du musst in diesem Fall ein String eval nehmen. Also soetwas.
Code: (dl )
eval "use ABC"


Allerdiengs würde ich auch lieber require nehmen da es anscheind genau das ist was du willst. Einziger Unterschied noch zu einem "use". Bei "use" wird noch automatisch die Subroutine "import" aus dem Package aufgerufen. Ein require macht das nicht. Hast du also ein Modul das Funktionen exportiert musst du danach noch Manuell "MODULNAME->import()" einmal aufrufen. Exportiert das Modul nichts oder möchtest du nicht in/ex-portieren kannst du den aufruf natürlich weg lassen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
KurtZ
 2008-05-20 21:19
#110026 #110026
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
EDIT: hat sich erledigt...
TMTOWTDYOG (there's more than one way to dig your own grave)
Gast Gast
 2008-05-21 15:28
#110062 #110062
Danke für eure Antworten.
<< >> 8 Einträge, 1 Seite



View all threads created 2008-05-20 17:49.