Christian Kruse: require

Beitrag lesen

Hallo Thomas,

Befindet sich im einzubindenden script beispielsweise der
Ausdruck:

$var = 'abc'

müsste meines Erachtens durch

require script.pl
print $var;

die Ausgabe:

abc erfolgen.

Warum ist das nicht so?

Wie sieht denn der Rest deines Moduls aus? Wenn deine Dateien etwa
so aussehen, geht es:

ckruse@sunshine:~ $ cat test.pl
#!/usr/bin/perl -w

require "test1.pl";

print $abc,"\n";

ckruse@sunshine:~ $ cat test1.pl

$abc = "abc";

1;
ckruse@sunshine:~ $ perl test.pl
Name "main::abc" used only once: possible typo at test.pl line 5.
abc
ckruse@sunshine:~ $

Benutzt du dagegen das Paket-System, geht es nicht mehr:

ckruse@sunshine:~ $ cat test.pl
#!/usr/bin/perl -w

require "test1.pl";

print $abc,"\n";

ckruse@sunshine:~ $ cat test1.pl
package test1;

$abc = "abc";

1;
ckruse@sunshine:~ $ perl test.pl
Name "main::abc" used only once: possible typo at test.pl line 5.
Use of uninitialized value in print at test.pl line 5.

ckruse@sunshine:~ $

Das liegt daran, dass die Module hier einen eigenen Namens-Raum
haben. $abc in test1.pl ist nicht dieselbe Variable wie $abc in
test.pl. Daher muss man dann den Namensraum wieder angeben:

ckruse@sunshine:~ $ cat test.pl
#!/usr/bin/perl -w

require "test1.pl";

print $test1::abc,"\n";

ckruse@sunshine:~ $ cat test1.pl
package test1;

$abc = "abc";

1;
ckruse@sunshine:~ $ perl test.pl
Name "test1::abc" used only once: possible typo at test.pl line 5.
abc
ckruse@sunshine:~ $

Diese Methode ist so aber recht unsauber, besser waere es, dem
Perl-Interpreter bekanntzugeben, wie er mit einer Variablen zu
verfahren hat. Dazu gibt es die Schluesselworte 'my' und 'our'. My
definiert eine Variable Scope-privat, in diesem Fall also Privat
fuer das Modul, waehrend our eine Variable global definiert. Dein
Fall in 'sauber' saehe dann ungefaehr so aus:

ckruse@sunshine:~ $ cat test.pl
#!/usr/bin/perl -w

use test1;

print $test1::abc,"\n";

ckruse@sunshine:~ $ cat test1.pm
package test1;

our $abc = "abc";

1;
ckruse@sunshine:~ $ perl test.pl
abc
ckruse@sunshine:~ $

Wenn du naeheres darueber erfahren moechtest, lies doch mal das
Kapitel ueber Module und Klassen in Perl (Perldoc-Kapitel perlobj,
perlmod, perlmodlib, perlmodstyle, perlnewmod, perlboot, perltoot,
perltooc und perlbot).

Uebrigens hilft use strict dir dabei, diese Richtlinien einzuhalten.
Du solltest dich vielleicht auch mal damit beschaeftigen ;-)

Grüße,
 CK

--
Der Mund ist das Portal zum Unglück.
http://wwwtech.de/