Welcher Block

Welcher Block

am 29.06.2006 13:42:22 von Ferry Bolhar

Hallo, liebe Leute,

angenommen, ich habe folgende Code:

sub show {
....
}

BEGIN {
show();
}

CHECK {
show();
}

INIT {
show();
}

END {
show();
}

show();

Hat show() eine Chance herauszufinden, wie (dh, im Context
welchen Blocks) es aufgerufen wurde bzw. direkt aus dem
Hauptprogramm?

Klar, ich kann es aus den jeweiligen Blöcken mit einem Argument
aufrufen, das ich dann auswerten kann. Mich würde aber eben
interessieren, ob Perl - sinngemäß zur caller() Funktion (aber die
hilft hier nichts) - hier eine andere Möglichkeit bietet.

Konkret interessant wäre es, festzustellen, ob Code während
des Compilierens (BEGIN Block) oder zur Laufzeit abläuft.

Schöne Grüße, Fery

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Welcher Block

am 29.06.2006 22:41:14 von Frank Wiegand

Ferry Bolhar schrieb:

> Konkret interessant wäre es, festzustellen, ob Code während
> des Compilierens (BEGIN Block) oder zur Laufzeit abläuft.

Code wird immer nur zur Laufzeit ausgeführt. Selbst ein BEGIN-Block muss
erst kompiliert werden, bevor er ausgeführt wird.

Wozu brauchst du das?


Frank

Re: Welcher Block

am 03.07.2006 09:54:31 von Ferry Bolhar

Frank Wiegand:

>> Konkret interessant wäre es, festzustellen, ob Code während
>> des Compilierens (BEGIN Block) oder zur Laufzeit abläuft.
>
> Code wird immer nur zur Laufzeit ausgeführt. Selbst ein BEGIN-Block muss
> erst kompiliert werden, bevor er ausgeführt wird.

Ja, klar. Mit "Compilieren" meinte ich das ganze Programm, dh., ein
bereits compilierter BEGIN-Block läuft, aber das (ganze) restliche
Script ist noch nicht fertig.

> Wozu brauchst du das?

Es geht um die Unterscheidung von BEGIN und INIT-Blöcken und
um XS-Code, der entweder in einem BEGIN oder in einem INIT-
Block läuft und wissen sollte, in welchem.

Theoretisch müsste man ja von XS-Code auch wie von einem Perl-
Skript auf die Stackframes der Funktionen, die den XS-Code auf-
gerufen haben, zugreifen können, und feststellen, von welchen Block
aus das geschah, oder nicht?

LG, Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Welcher Block

am 03.07.2006 10:21:59 von Christian Winter

Ferry Bolhar schrieb:
> Hallo, liebe Leute,
>
> angenommen, ich habe folgende Code:
>
> sub show {
> ....
> }
>
> BEGIN {
> show();
> }
>
> CHECK {
> show();
> }
>
> INIT {
> show();
> }
>
> END {
> show();
> }
>
> show();
>
> Hat show() eine Chance herauszufinden, wie (dh, im Context
> welchen Blocks) es aufgerufen wurde bzw. direkt aus dem
> Hauptprogramm?
>
> Klar, ich kann es aus den jeweiligen Blöcken mit einem Argument
> aufrufen, das ich dann auswerten kann. Mich würde aber eben
> interessieren, ob Perl - sinngemäß zur caller() Funktion (aber die
> hilft hier nichts) - hier eine andere Möglichkeit bietet.

Was ist mit caller() nicht in Ordnung?

X:\>perl -e "sub show { print +(caller(1))[3].$/ }; BEGIN { show() }"
main::BEGIN

Sieht doch ganz gut aus, oder?

-Christian

Re: Welcher Block

am 03.07.2006 10:22:39 von Frank Seitz

Ferry Bolhar wrote:
> Frank Wiegand:
>>
>>Wozu brauchst du das?
>
> Es geht um die Unterscheidung von BEGIN und INIT-Blöcken und
> um XS-Code, der entweder in einem BEGIN oder in einem INIT-
> Block läuft und wissen sollte, in welchem.

Warum teilst Du den Unterschied nicht einfach
mittels eines Parameters mit?

> Theoretisch müsste man ja von XS-Code auch wie von einem Perl-
> Skript auf die Stackframes der Funktionen, die den XS-Code auf-
> gerufen haben, zugreifen können, und feststellen, von welchen Block
> aus das geschah, oder nicht?

Wenn der Code es partout selbst rausfinden soll, würde
ich einen Perl-Wrapper um den XS-Aufruf legen, der alles
Nötige rausfindet und weitergibt.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel