require
Thomas
- perl
0 Struppi0 Christian Kruse0 Thomas
Hallo,
ich möchte unter Perl mit require ein weiteres Script einbinden. Den Seiten von Selfhtml konnte ich entnehmen, dass der Code des einzubindenden Scriptes einfach an der Stelle platziert wird. Allerdings scheint dies für Variablen nicht zu gelten.
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?
Gruß
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?
Bei mir ist das so.
Aber das ist kein guter Stil, da er nicht mehr strict ist.
Um Konfigurationsvariabeln einzulesen gibt es vielfältige Möglichkeiten.
Die einfachste ist in deiner ConfigDatei ein Hash zu deklarieren und das zu exportieren und dann auf die Keys zuzugreifen:
Ini.pm:
package Ini;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(%INI);
our %INI = (
wert1 => 'test',
)
test.pl:
use Ini;
print $INI{wert1};
Das ist aber nicht sonderlich elegant, da du so z.b. Tippfehler nicht merkst.
Besser ist es eine funktion zu exportieren, die den Wet zurück gibt:
Ini.pm:
package Ini;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(&getIni);
my %INI;
sub getIni
{
my $k = shift;
die "Schlüssel existiert nicht." unless exists $INI{$k};
return $INI{$k};
}
%INI = (
wert1 => 'test',
);
1;
use strict;
use Ini;
print getIni('wert1');
print getIni('test');
Es gibt aber auch noch einen Haufen Module dafür, was man dann verwendet ist Geschmackssache.
Struppi.
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
Hallo Christian,
dein Beitrag hat mir sehr geholfen. Mein Fehler war letzten Ende eigentlich nur, dass ich $var mit my deklariert habe. Deshalb hat er diese Variablen nicht in das einzubettende Skript übernommen.
Vielen Dank
Thomas