Schrift
[thread]5814[/thread]

use und OO verwirren mich: liegt wahrscheinlich am Namespace



<< >> 5 Einträge, 1 Seite
macMeck
 2003-10-13 15:59
#62791 #62791
User since
2003-08-04
162 Artikel
BenutzerIn
[default_avatar]
Hallo,

kann mir mal bitte jemand folgendes Problemchen erklären und mir vielleicht weiterhelfen? Ich stehe momentan voll auf dem Schlauch.

Also ich hab folgendes Programm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#/usr/bin/perl -w

use strict;
use diagnostics;
use warnings;

use myModule 0.02;
use myZweitesModule 0.01;

print "myModule-Version ist : $myModule::VERSION\n";
print "myZweitesModule-Version ist: $myZweitesModule::VERSION\n";
und folgende beiden Module dazu:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
package myModule;
use strict;
use diagnostics;
use warnings;

use Exporter;

our @ISA = qw (Exporter);
our @EXPORT = qw ($VERSION);

our $VERSION = 0.02;

1;

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
package myZweitesModule;
use strict;
use diagnostics;
use warnings;

use Exporter;

our @ISA = qw (Exporter);
our @EXPORT = qw ($VERSION);

our $VERSION = 0.01;

1;


Zunächst einmal passiert genau das, was man erwartet. Ausgabe ist
myModule-Version ist : 0.02
myZweitesModule-Version ist: 0.01


Wenn ich jetzt in myZweitesModule myModule mit use einbinde und zwar VOR der package-Definition von myZweitesModule passt auch noch alles und die Ausgabe ist die gleiche.
Wenn ich myModule in myZweitesModule allerdings hinter der package-Definition einbinden kommt die folgende Ausgabe:
myModule-Version ist : 0.01
myZweitesModule-Version ist: 0.01

myModule sagt jetzt es wäre Version 0.01, jedoch bricht der Compiler nicht ab, obwohl Version 0.02 verlangt wird.

Ganz ominös wird das ganze jedoch wenn man aus diesem Zustand heraus im Hauptprogramm vom Modul myModule Version 0.03 verlangt. Dann bricht der Compiler ab und meldet, dass er nur Version 0.02 zur Verfügung hat.

Das hängt doch bestimmt mit den Namespaces zusammen oder so... Kann mir jemand auf die Sprünge helfen???

macMeck
It all works, as long as it's documented!
Strat
 2003-10-13 16:24
#62792 #62792
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
es handelt sich um ein Problem mit Exporter: CPAN:Exporter
Kurz gesagt: dein Hauptprogramm laeuft im Package main. Dein Modul1 im Package MyModule1. Der Exporter sagt dem Modul, es soll das Modul in den aktuellen Namensraum des Aufrufers (in diesem Fall main) importieren, sodass da $MyModule::VERSION gleich $main::VERSION wird. soweit - sogut.

Wenn du jedoch ZweitesModul in MyModul einbindest, wird $ZweitesModul::VERSION durch den Exporter in den Namensraum des Aufrufers (=MyModule) importiert, und ueberschreibt somit $MyModule::Version.

die Spezialvariable $VERSION zu exportieren ist somit ziemlich ungeschickt.

In meinen Scripten verzichte ich zu 99% auf den Exporter (bzw. verwende nur EXPORT_OK -> siehe doku) und gebe die Variablen/Subroutinen immer voll qualifiziert an, weil ich finde, es macht das Programm klarer (oder weisst du, von woher nun $VERSION wirklich kommt? oder &GiveMeFive() ?). Also z.B. $MyModule::Version oder MyZweitesModule::Version oder so...

vorhandene Module lade ich meistens mit
use CGI ();
weil die Klammern hinter dem Modulnamen (=leere Liste) diese Namensraumverschmutzung (=Namespacepollution) des Exporters verhindert\n\n

<!--EDIT|Strat|1066048001-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2003-10-13 16:42
#62793 #62793
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@macMeck: wieso exportierst du überhaupt die variable $VERSION?
du benutzt sie doch eh nur mit vollem namen, also brauchst du sie gar nicht
exportieren.
interessieren tät mich aber jetzt, wo du dir das abgeguckt hast... schlechtes
buch?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
macMeck
 2003-10-13 18:40
#62794 #62794
User since
2003-08-04
162 Artikel
BenutzerIn
[default_avatar]
Aaaaaaaaaaaaaaaaaaaah, schande über mich!!! Ihr habt natürlich Recht. So ein Quatsch die Version zu exportieren. Das kann ja gar nicht funktionieren.
Hatte mir das mal beim OO-Einstieg (ist noch nicht so lange her) da reingebastelt und seitdem immer nur kopiert. Irgendwie war ich der Meinung, der Versionscheck kann nur funktionieren, wenn die Version auch exportiert wird. Das war wohl keiner meiner lichten Momente.

@pq: sowas steht nichtmal in den schlechtesten Büchern.

Danke euch.
It all works, as long as it's documented!
pq
 2003-10-13 18:47
#62795 #62795
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=macMeck,13.10.2003, 16:40]Hatte mir das mal beim OO-Einstieg (ist noch nicht so lange her) da reingebastelt und seitdem immer nur kopiert.[/quote]
sowas kenn ich. meine ersten perl-skripte enthielten exit(1);, weil
ich das so aus einem skript aus dem netz abgeguckt hatte. bis ich
irgendwann mal lernte, dass das einen fehler bedeutet, mit einem status != 0
das skript zu beenden...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 5 Einträge, 1 Seite



View all threads created 2003-10-13 15:59.