Externes Skript einbinden: do/require

Externes Skript einbinden: do/require

am 18.05.2006 20:27:14 von Oliver Block

Hallo,

es gibt in Perl ja die Möglichkeit externe Dateien einzubinden. Was mir
allerdings nicht ganz klar ist, ist der Geltungsbereich bei Verwendung von
use strict. Wie werden die Variablen des externen Skripts im einbindenden
Skript verwendbar?

Soweit mir bekannt ist, ist der Geltungsbereich globaler Variablen die
Datei.


Gruß,

Oliver

Re: Externes Skript einbinden: do/require

am 19.05.2006 16:39:46 von Ferry Bolhar

Oliver:

> es gibt in Perl ja die Möglichkeit externe Dateien einzubinden. Was mir
> allerdings nicht ganz klar ist, ist der Geltungsbereich bei Verwendung von
> use strict. Wie werden die Variablen des externen Skripts im einbindenden
> Skript verwendbar?
>
> Soweit mir bekannt ist, ist der Geltungsbereich globaler Variablen die
> Datei.

Zunächst: der Geltungsbereich globaler Variablen hat mit "use strict" nichts
zu tun. "use strict" (eigentlich "use strict vars") sagt nur, dass globale
Variable,
so sie nicht mit "our" (oder vor Perl 5.6 mit "use vars") deklariert wurden,
stets voll ausgeschrieben, dh., mit Namensraumangabe aufscheinen müssen.

Dann: der Geltungsbereich globaler Variablen erstreckt sich auf das ganze
Programm (daher der Name "global"!). Eine globale Variable kann man
immer mit ihrem vollen Namen (dh., Namensraum (package) + Variable-
namen) ansprechen. Fehlt die Angabe des Namensraumes, wird der
gerade eingestellte Namensraum dafür eingesetzt. Defaultmäßig ist das
"main".

Und schließlich: Dateien sind wie große Blöcke, dh., man kann sich den
Code innerhalb einer Datei von {...} umrahmt vorstellen (tatsächlich wird
er zur Laufzeit so ausgeführt). Dh., alles was man in einem Block definieren
kann und was dann nur innerhalb des Blocks Gültigkeit hat, trifft auch auf
Dateien zu. Und da "package" Anweisungen - ebenso wie zB "my"-
Deklarationen - einen lexikalischen Geltungsbereich haben, gelten sie, so
sie am Beginn einer Datei aufscheinen, für den gesamten Inhalt dieser Datei,
aber eben nur für diese Datei. Danach wird wieder der vorherige Wert
übernommen.

Konkretes Beispiel zu deiner Frage bzgl. "use strict":

a.pl enthält:

use strict;
our $test = 1;
do 'b.pl';
print "$test\n";

b.pl enthält:

$test++;

Der Aufruf von

perl a.pl

gibt 2 zurück. Dh., man kann - ob mit oder ohne "use strict" - die globale
Variable $test von a.pl und von b.pl aus ganz normal ansprechen.

PS: Wer kennt übrigens den/die Unterschied(e) "require" <=> "do"?

LG, Ferry

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

Re: Externes Skript einbinden: do/require

am 19.05.2006 16:57:58 von Wolf Behrenhoff

Ferry Bolhar schrieb:
> PS: Wer kennt übrigens den/die Unterschied(e) "require" <=> "do"?

Zwei Beispiele -- erstes Beispiel:

b.pl enthalte nur folgende Zeile:
print "b\n";

Dann vergleiche man folgende Befehle:
1: perl -we "require 'b.pl'; require 'b.pl'"
2: perl -we "do 'b.pl'; do 'b.pl'"


Zweites Beispiel:

1: perl -we "require 5.6.0 and print q{x}"
2: perl -we "do 5.6.0 and print q{x}"

Wolf

Re: Externes Skript einbinden: do/require

am 19.05.2006 17:04:47 von Ferdinand Ihringer

Ferry Bolhar wrote:
[ganz viel]
> PS: Wer kennt übrigens den/die Unterschied(e) "require" <=> "do"?

perldoc -f require
perldoc -f do

Durch require wird eine Datei nur einmal eingebunden. Es wird alles in @INC
durchsucht. Eingebundene Modulen sollten true zurückgeben.

Ferdinand