[Perl] Namespace Probleme

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von biont, 16.07.2009.

  1. #1 biont, 16.07.2009
    Zuletzt bearbeitet: 16.07.2009
    biont

    biont Grünschnabel

    Dabei seit:
    09.07.2009
    Beiträge:
    4
    Zustimmungen:
    0
    Hallo zusammen,

    irgendwie scheitere ich gerade daran, meine sehr lange Hauptdatei in viele Module (*.pm) mit einem Steuerprogramm (.pl) zu unterteilen. Folgende Konfiguration:

    Im Hauptprogramm "haupt.pl"
    Code:
    use strict;
    use neben1;
    
    our $glob_var;
    Im Modul "neben1.pm"
    Code:
    package neben1;
    
    $glob_var = 5;
    
    1;
    Da kommt dann eine Fehlermeldung à la:
    Offensichtlich erkennt der Interpreter ja, dass die Variable "global" ist. Warum entscheidet er sich dann, dass er sie nicht beschreiben kann, weil sie nie im Modul deklariert wurde...?

    Wie kann ich sonst das Problem lösen, dass ich eine Variable aus dem Hauptprogramm in einem Untermodul beschreiben kann? Wozu stoße ich überhaupt (per use-Befehl) den Namespace-Austausch zwischen den Teilen an? ?(

    Ein mitgeben des Package-Names mag er ja auch nicht (in neben1.pm):
    Code:
    main::$glob_var = 5;
    =>
    Grüße


    <------EDIT------>
    Ein
    Code:
    $main::glob_var = 5;
    wirkt Wunder... :erschlag:

    Trotzdem bin ich irritiert, dass "our" nicht _richtig_ global macht...
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. .mike.

    .mike. Doppel-As

    Dabei seit:
    27.08.2006
    Beiträge:
    207
    Zustimmungen:
    0
    Evtl. interessiert dich das Modul Exporter
     
  4. #3 reneeb, 17.07.2009
    Zuletzt bearbeitet: 17.07.2009
    reneeb

    reneeb Grünschnabel

    Dabei seit:
    17.07.2009
    Beiträge:
    3
    Zustimmungen:
    0
    Das hätte ja auch fatale Folgen, wenn es global (nach Deiner Definition) wäre.

    Stell Dir mal vor, Du hättest zwei Module:

    Code:
    package Eins;
    
    use strict;
    use warnings;
    
    our $global_var = 4;
    
    sub print_var { print $global_var }
    
    1;
    und
    Code:
    package Zwei;
    
    use strict;
    use warnings;
    
    our $global_var = 5;
    
    sub print_var { print $global_var }
    
    1;
    Was würde ausgegeben werden wenn Du Zwei::print_var() aufrufen würdest?

    Das würde dann ganz davon abhängig sein, in welcher Reihenfolge Du die Module laden würdest:

    Code:
    use Eins;
    use Zwei;
    
    Zwei::print_var()
    würde "5" ausgeben, ein
    Code:
    use Zwei;
    use Eins;
    
    Zwei::print_var();
    würde hingegen "4" ausgeben, weil die Zuweisung in dem zuletzt geladenen Modul die vorherigen Zuweisungen überschreiben würde.

    In so einem Falle wäre ein Verhalten des Programms nicht vorherzusehen. Denn was wäre, wenn Du ein weiteres Modul in den Modulen lädst, das $global_var überschreibt? Was, wenn die wiederum Module laden, die $global_var überschreiben?

    Es ist also eine gute Entscheidung, dass "our" nur die *Sichtbarkeit* der Variablen global macht.

    Wenn Du einfach die Definitionen der Variablen auslagern willst, könntest Du die "package"-Anweisung weglassen, denn dann gehört das Modul zum package main (Der Hinweis von .mike. mit "Exporter" zeigt aber die bessere Lösung):

    Testskript.pl
    Code:
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    our $var;
    
    use MyTest;
    
    print $var;
    MyTest.pm:
    Code:
    $var = 5;
    
    1;
    Ausgabe:
    Code:
    $ main.pl
    5
    $
     
Thema:

[Perl] Namespace Probleme

Die Seite wird geladen...

[Perl] Namespace Probleme - Ähnliche Themen

  1. [Perl] Perl OO Methodenaufruf in anderem Objekt

    [Perl] Perl OO Methodenaufruf in anderem Objekt: Hallo, Ich bin dabei in Perl ein Pokerspiel zu programmieren, hänge aber momentan an einem Problem, wo ich nicht weiterkomme. Ich habe die...
  2. [Perl] Check auf Referenz...Hash

    [Perl] Check auf Referenz...Hash: Hallo! Mal ne kleine Frage. Gibt es ein Funktion mit der ich checken kann, ob in einem Hash der Value eine Referenz auf einen weiter Hash...
  3. [Perl]: Mehr als ein Objekt auf einmal instanziieren

    [Perl]: Mehr als ein Objekt auf einmal instanziieren: Hallo zusammen, ich benutze zurzeit Net::FTPSSL zum Aufbau einer FTP Connection. Mein Problem ist, wenn ich z.B. eine Verbindung zu 5...
  4. [Perl] Script zum ändern der Signatur in vB-Boards

    [Perl] Script zum ändern der Signatur in vB-Boards: Hallo, folgendes Script funktioniert beim gulli:board , aber leider nicht hier: #!/usr/bin/perl use LWP::UserAgent; $agent = new...
  5. [Perl] Objekte dynamisch benennen

    [Perl] Objekte dynamisch benennen: Guten Morgen zusammen, ich hole mir aus einem XML file zu beliebig vielen "Signalen" meine Eigenschaften und möchte sie in der selben Anzahl...