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