Thomas: require

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

  1. 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.

  2. 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/
    1. 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