[Perl] Namespace Probleme

biont

biont

Grünschnabel
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:
Global symbol "$glob_var" requires explicit package name at blabla/neben1.pm line 3...

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;
=>
Bad name after main:: at blabla/neben1.pm...

Grüße


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

Trotzdem bin ich irritiert, dass "our" nicht _richtig_ global macht...
 
Zuletzt bearbeitet:
Ein
Code:
$main::glob_var = 5;
wirkt Wunder... :erschlag:

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

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
$
 
Zuletzt bearbeitet:

Ähnliche Themen

dovecot und postfix Konfiguration Problem

NagiosGrapher 1.7.1 funktioniert nicht

Samba Update von 3.2.5 auf 3.5.6 - Probleme beim Server Browsen

Xorg probleme mit Maus und Tastertur

VHOST Problem, Debian Lenny

Zurück
Oben