Christian Kruse: Variable our & use vars - Nachtrag

Beitrag lesen

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