Schrift
[thread]6421[/thread]

use verzögert ausführen: geht das? (Seite 2)



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Crian
 2004-07-22 11:58
#84709 #84709
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Ja. Es ist entscheidend. Und außerdem muss natürlich die Funktion zum Zeitpunkt, wo der Parser/Interpreter/Compiler (?) auf den BEGIN-Block trifft, die Parameter-Behandel-Funktion und alle Funktionen, die diese eventuell aufruft, schon bekannt sein.

Deshalb sieht der Code jetzt so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
....
#use Modul; # .... jetzt ganz unten nach dem BEGIN-Block
....
#param();  # .... jetzt ganz unten im BEGIN-Block
....
sub param {...}
sub syntax {...}
....
....
....
BEGIN { param(); }
use Modul;


und es tut, was es soll. =)

Schönen Dank!\n\n

<!--EDIT|Crian|1090483344-->
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
ptk
 2004-07-22 12:02
#84710 #84710
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Crian,22.07.2004, 09:50]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?
[/quote]
Das schimpft sich "indirect object syntax" (siehe auch perldoc perlobj). Diese Syntax ist eigentlich fuer die Schreibweise
Code: (dl )
new Modul $args, ...
gedacht, damit man nicht
Code: (dl )
Module->new($args,...)
schreiben muss, aber man kann es auch anderweitig verwenden:
Code: (dl )
1
2
3
4
5
sub bla {
warn "@_";
}

bla main 1, 2, 3;


Oder hast du eher wegen des "import" gefragt?

Quote
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 ;-)

Ja. BEGIN-Bloecke und use-Statements werden sequentiell abgearbeitet.
Crian
 2004-07-22 12:08
#84711 #84711
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Interessant: Wenn param() mit exit(0); verlassen wird (etwa weil mit -h nur die Syntaxausgabe angefordert wurde) ist alles ok, wird exit allerdings mit einem Wert ungleich Null aufgerufen, so gibt das Programm am Ende noch aus:

Code: (dl )
1
2
Callback called exit at U:\CD\work\tag\tagfile.pl line 885.
BEGIN failed--compilation aborted at U:\CD\work\tag\tagfile.pl line 885.


Das ist natürlich nicht falsch, allerdings steht darüber dann schon eine lange Erklärung von mir, was falsch gelaufen ist und wie man es richtig macht. Deshalb irritierrt das den Benutzer dann eventuell.

Gibt es eine andere Alternative dazu, das Programm immer mit exit(0); zu verlassen? Eigentlich wollte ich gerne den Fehlerstatus mitgeben, auch wenn dieser bisher noch nicht außerhalb ausgewertet wird.
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
 2004-07-22 12:17
#84712 #84712
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=ptk,22.07.2004, 10:02]Das schimpft sich "indirect object syntax" (siehe auch perldoc perlobj). Diese Syntax ist eigentlich fuer die Schreibweise
Code: (dl )
new Modul $args, ...
gedacht, damit man nicht
Code: (dl )
Module->new($args,...)
schreiben muss, aber man kann es auch anderweitig verwenden:
Code: (dl )
1
2
3
4
5
sub bla {
   warn "@_";
}

bla main 1, 2, 3;


Oder hast du eher wegen des "import" gefragt?[/quote]

Ja, ich fragte mich, ob import so etwas wie use und require und mir bisher nur entgangen ist. Außerdem war mir das mit der "indirect object syntax" nicht so klar (ich wusste, dass es das für new gibt und ich wusste auch, dass man nicht auf den Methodennamen new festgelegt ist, aber ich hab 2 und 2 nicht zusammengezählt ;-). [Außerdem mache ich gedanklich immer noch mehr Unterschiede zwischen oo / nicht-oo als Perl dies macht.]


[quote=ptk,22.07.2004, 10:02]
Quote
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 ;-)

Ja. BEGIN-Bloecke und use-Statements werden sequentiell abgearbeitet.[/quote]

Ja, hab ich inzwischen auch festgestellt. Man muss es sich wohl so vorstellen, dass die BEGIN-Blöcke in der Reihenfolge ihres Auftretens ausgeführt werden und ein use Modul; die BEGIN-Blöcke des Moduls an der Stelle des use zwischen die ev. vorhandenen anderen BEGIN-Blöcke einfügt (jedenfalls in der Abarbeitungsreighenfolge).
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
ptk
 2004-07-22 14:37
#84713 #84713
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Crian,22.07.2004, 10:17][quote=ptk,22.07.2004, 10:02]
Oder hast du eher wegen des "import" gefragt?[/quote]

Ja, ich fragte mich, ob import so etwas wie use und require und mir bisher nur entgangen ist.
[/quote]
import() ist mehr eine Konvention als ein Sprachmittel. Vereinfacht gesagt wird ein "use Modul" als "require Modul" und "import Modul" ausgefuehrt. In der import-Methode werden normalerweise Symbole aus dem Modul in den Namensraum des aufrufenden Programms/Moduls importiert, so dass man sich das Schreiben des Modul-Prefixes sparen kann. Ueblicherweise schreibt man import nicht selbst, sondern laesst das "Exporter" erledigen.
Quote
Ja, hab ich inzwischen auch festgestellt. Man muss es sich wohl so vorstellen, dass die BEGIN-Blöcke in der Reihenfolge ihres Auftretens ausgeführt werden und ein use Modul; die BEGIN-Blöcke des Moduls an der Stelle des use zwischen die ev. vorhandenen anderen BEGIN-Blöcke einfügt (jedenfalls in der Abarbeitungsreighenfolge).

Nicht ganz: jeglicher Code im ge'use'ten Modul wird ausgefuehrt. D.h. wenn ein print ausserhalb von subs steht, wird es schon waehrend "use Modul" ausgegeben.
betterworld
 2004-07-22 17:09
#84714 #84714
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Crian,22.07.2004, 10:08]Interessant: Wenn param() mit exit(0); verlassen wird (etwa weil mit -h nur die Syntaxausgabe angefordert wurde) ist alles ok, wird exit allerdings mit einem Wert ungleich Null aufgerufen, so gibt das Programm am Ende noch aus[/quote]
POSIX::_exit()

Edit: Zitat geaendert.\n\n

<!--EDIT|betterworld|1090502020-->
sri
 2004-07-22 19:23
#84715 #84715
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=ptk,22.07.2004, 12:37]
Quote
Ja, hab ich inzwischen auch festgestellt. Man muss es sich wohl so vorstellen, dass die BEGIN-Blöcke in der Reihenfolge ihres Auftretens ausgeführt werden und ein use Modul; die BEGIN-Blöcke des Moduls an der Stelle des use zwischen die ev. vorhandenen anderen BEGIN-Blöcke einfügt (jedenfalls in der Abarbeitungsreighenfolge).

Nicht ganz: jeglicher Code im ge'use'ten Modul wird ausgefuehrt. D.h. wenn ein print ausserhalb von subs steht, wird es schon waehrend "use Modul" ausgegeben.[/quote]
Denn
Code: (dl )
use Modul;

ist genau das selbe wie
Code: (dl )
BEGIN { require Modul; import Modul; }
Crian
 2004-07-23 14:19
#84716 #84716
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
aha :-)
Also ist import zwar Konvention, aber eine sehr feste.

@betterworld: danke, ich hab POSIX::_exit eingebaut, allerdings sagt er dann:

Quote
Undefined subroutine &POSIX::_exit called at ...


Das hat sich nach use POSIX qw//; aber ganz schnell gegeben ;-)\n\n

<!--EDIT|Crian|1090578286-->
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
betterworld
 2004-07-23 16:11
#84717 #84717
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Crian,23.07.2004, 12:19]Das hat sich nach use POSIX qw//; aber ganz schnell gegeben ;-)[/quote]
Ich wusste, dass Du darauf kommst, also habe ich es nicht geschrieben :)
Quote
Also ist import zwar Konvention, aber eine sehr feste.

Naja, wenn Du Exporter verwendest, kannst Du Dich afaik darauf verlassen, dass es import gibt.
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



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