Hoi,
erstmal Danke für die Hilfe, jetzt ist mir einiges klarer ...
Schoen
Weil es einen anderen Namespace hat. Lass das 'our $x' weg und
schreib stattdessen
$main::x
Für was steht den $main bzw. was ist/macht diese Variable ?
Das ist keine Variable. Das bezeichnet den Namespace 'main', den Namespace,
den das ausfuehrende Script hat. Die Variable ist immer noch '$x'.
Könnt ich diese Variable auch $hund nennen oder ist das ne
Umgebungsvariable wie $_ oder so?
Nein, es ist keine Variable. Es bezeichnet einen Namespace. Und wenn du ein
Modul 'hund' hast, dann kannst du auch $hund::x schreiben, ja ;-)
[... kaputtes Perl ...]
Das geht so nicht. Schreibs so:
Script.pl:
#!/usr/bin/perl -w
use strict;
use Module;
$Module::x += 5;
print "$Module::x\n";
----------------------------
Module.pm:
package Module;
our $x = 10;
1;
Zur Erklaerung: das 'use Module' bindet die Datei 'Module.pm' (Achtung,
Case-Sensitive!) ein. Das 'package Module;' leitet ein Modul und damit auch
einen eigenen Namespace ein. Durch das 'our $x' registrierst du die Variable
'$x' in den Symbol-Tabellen des Moduls 'Module'. In den Symbol-Tabellen sind
alle globalen Variablen und alle Typeglobs eingetragen; das kannst du sehr
schoen in dem folgenden Script sehen:
#!/usr/bin/perl -w
use vars qw($hallo);
my $hallo1;
print join "\n" => keys %::;
eof
Die Ausgabe ist:
@
stdin
STDIN
"
_<./test.pl
stdout
STDOUT
$
_<perlmain.c
BEGIN
_</usr/libdata/perl/5.00503/vars.pm
^H
ENV
IO::
UNIVERSAL::
/
hallo <----- HIER STEHT UNSERE VARIABLE $hallo
vars::
ARGV
0
^R
stderr
STDERR
^W
DynaLoader::
^X
main::
Carp::
DB::
INC
_</usr/src/gnu/usr.bin/perl/libperl/../../../../contrib/perl5/universal.c
]
CORE::
Du siehst also an diesem Beispiel, lexikalisierte Variablen, also
'my'-Variablen, werden *nicht* in die Symbol-Tabelle eingetragen.
Aber Perl verzeichnet nicht nur globale Variablen in der Symbol-Tabelle,
sondern auch alle Module. Wenn ich also mal dein Beispiel zu Rate ziehe:
@
stdin
_<./test.pl
^H
strict::
UNIVERSAL::
^R
^W
DynaLoader::
^X
main::
Carp::
INC
_</usr/src/gnu/usr.bin/perl/libperl/../../../../contrib/perl5/universal.c
]
_
"
STDIN
STDOUT
stdout
_</usr/libdata/perl/5.00503/strict.pm
_<perlmain.c
$
BEGIN
_</usr/libdata/perl/5.00503/vars.pm
ENV
IO::
_<Module.pm
/
vars::
0
ARGV
STDERR
stderr
DB::
Module:: <--- HIER IST DEIN MODUL
CORE::
Ich hoffe, jetzt verstehst du es etwas besser. Wenn nicht, frag einfach nach.
Wenn dich die Materie interessiert, wuerde ich dir das Buch 'Effektiv Perl
programmieren' empfehlen -- das ist *wirklich* gut :-)
Gruesse,
c.j.k