Schrift
[thread]6421[/thread]

use verzögert ausführen: geht das?



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Crian
 2004-07-21 17:18
#84699 #84699
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich habe ein Skript, welches ein Modul mit use Mein::Modul; einbindet. Dieses Modul wiederum initialisiert im BEGIN-Block interne Hashes aus eingelesenen Dateien.

So weit so gut, zu Beginn muss man jedoch immer lange warten, bevor die Parameter des Skriptes abgeprüft werden.

Es wäre schön, wenn ich das Modul erst nach Behandlung der Parameter einbinden könnte, damit der Benutzer nicht 20 Sekunden (oder so) auf die Antwort auf skript.pl -h oder auf die Fehlerbehandlung (falsche Parameter ...) warten muss.
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
format_c
 2004-07-21 17:22
#84700 #84700
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
perldoc -f require

Gruß Alex
betterworld
 2004-07-21 18:06
#84701 #84701
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Kannst Du nicht auch in dem einbindenden Modul einen BEGIN-Block bauen? Der muesste doch dann vor dem anderen BEGIN-Block ausgefuehrt werden.
Gast Gast
 2004-07-21 18:24
#84702 #84702
Eine Lösung könnte sein, auf den BEGIN-Block des Moduls zu verzichten und alles was darin passiert entweder in den Konstruktor des Moduls oder in eine (private) Init-Routine des Moduls zu packen oder aber den ganzen Kram im Header des Moduls (also im Sinne von Klassen-Daten) erledigen zu lassen.

Das Modul selbst kannst Du dann auch per 'require' einbinden.

Wenn allerdings die Initialisierung der von Dir genannten Hashes allein deshalb so viel Zeit benötigt weil die einzulesende Datenmenge sehr groß ist, dann hast Du kaum eine Chance die Wartezeit zu verkürzen (es sei denn Du läßt diese Initialisierung im Hintergrund ablaufen; das kann aber auch nur dann etwas bringen wenn die zu initialisierenden Daten nicht 'sofort' vom Hauptprogramm benötigt werden).
Crian
 2004-07-21 19:22
#84703 #84703
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
require hatte ich schonmal probiert, aus irgendeinem Grund schied diese Variante aus (ich werde das aber nochmal testen).

Die Idee mit dem BEGIN-Block im Skript finde ich spannend.

@dieter: Ja die Zeit kommt durch die Größe der Dateien. Es geht mir auch nicht darum, diese zu eliminieren, ich würd nur gern die Fehlerprüfung und Parameterauswertung vorher erledigen.
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
sri
 2004-07-21 19:39
#84704 #84704
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nicht zu empfehlen. ;)

Code: (dl )
1
2
3
4
5
package My::Module;
local $SIG{ALRM} = sub {
# initialize stuff
};
alarm(20);


oder richtig

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package My::Module;

sub import {
# initialize stuff
}

1;

package main;

require My::Module;

# handle parameters

import My::Module;


oder richtig richtig

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package My::Module;

sub new {
# initialize stuff
return bless {};
}

1;

package main;

use My::Module;

# handle parameters

my $my = My::Module->new;


oder einfach

Code: (dl )
1
2
3
4
BEGIN {
# handle parameters
}
use My::Module;
\n\n

<!--EDIT|sri|1090425678-->
betterworld
 2004-07-21 21:59
#84705 #84705
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Ich weiss nicht, ob das jetzt hilft, aber ich habe in einem Programm von mir folgendermassen gehackt:
Zunaechst wird main.pl gestartet. Das schaut sich @ARGV ein wenig an, setzt je nach Befehlszeilenparameter ein paar globale Variablen, veraendert @INC eventuell und fuehrt dann
Code: (dl )
eval { require "main2.pl";}

aus. Das ist sehr praktisch, da main2.pl nun einfach use Modul benutzen kann, was erst jetzt moeglich ist, da @INC entsprechend angepasst wurde.
sri
 2004-07-21 23:48
#84706 #84706
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=betterworld,21.07.2004, 19:59]Ich weiss nicht, ob das jetzt hilft, aber ich habe in einem Programm von mir folgendermassen gehackt:
Zunaechst wird main.pl gestartet. Das schaut sich @ARGV ein wenig an, setzt je nach Befehlszeilenparameter ein paar globale Variablen, veraendert @INC eventuell und fuehrt dann
Code: (dl )
eval { require "main2.pl";}

aus. Das ist sehr praktisch, da main2.pl nun einfach use Modul benutzen kann, was erst jetzt moeglich ist, da @INC entsprechend angepasst wurde.[/quote]
Ein eigenes script nur für use?

Warum kein string eval?

Code: (dl )
1
2
@INC = qw(lala foo yada);
eval 'use My::Module';


oder einfach manuell

Code: (dl )
1
2
3
@INC = qw(lala foo yada);
require My::Module;
import My::Module;
betterworld
 2004-07-22 00:18
#84707 #84707
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=sri,21.07.2004, 21:48]Ein eigenes script nur für use?[/quote]
Nein, nicht nur fuer use. In main2.pl startet das eigentliche Programm und kann dabei Programme benutzen, die in Verzeichnissen liegen, die von main.pl berechnet werden. Waere wahrscheinlich auch mit einem BEGIN-Block gegangen.
Crian
 2004-07-22 11:50
#84708 #84708
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Danke für die vielen Lösungsvorschläge.

Initialisierung in new scheidet aus, da die Daten für alle Objekte gleich sind (werden nur gelesen) und deshalb zur Klasse und nicht zum Objekt gehören. Allerdings könnte ich natürlich eine globale Variable haben, die angibt, ob schon eingelesen wurde oder nicht und wenn nicht einlesen.

Interessant finde ich allerdings die Lösung mit der sub import. Ist das ein Sprachmittel, oder kann ich jede Funktion x im Modul M mit x M; starten? Ich denke mal nicht, oder?

Edit: Ist es bei dieser Lösung

Code: (dl )
1
2
3
4
BEGIN {
# handle parameters
}
use My::Module;


entscheidend, dass der BEGIN Block vor dem use ist? Jaja, ich probiers ja gleich aus ;-)\n\n

<!--EDIT|Crian|1090483004-->
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 >| >> 19 Einträge, 2 Seiten



View all threads created 2004-07-21 17:18.