Hi Siechfred,
Sorry aber my-Variablen haben leider nichts mit Namespaces zu tun und kommen auch nicht in die Symboltabelle, da ist alleine der Scope entscheidend.
Dein Code geht von der irrigen Annahme aus $bar::foo_loc würde überhaupt angelegt.
Probier mal das folgende aus:
use strict;
my $foo = 'declared in main';
$\="\n";
package bar;
$foo .= ' and modified in bar';
my $foo_loc = 'my foo_loc';
our $foo_glob = 'local in bar but visible outside';
print defined $bar::foo_loc ? $bar::foo_loc : 'undef'; # undef
package main;
# wir wollen keinen Scriptabbruch provozieren
no strict 'vars';
print defined $foo ? $foo : 'undef'; # declared in main and modified in bar
print defined $bar::foo_loc ? $bar::foo_loc : 'undef'; # undef
print defined $foo_loc ? $foo_loc : 'undef'; # undef
print defined $bar::foo_glob ? $bar::foo_glob : 'undef'; # local in bar but visible outside
Hier kann man sehr schön die Auswirkungen des lexikal scopes sehen. $foo ist im Namensraum 'main' deklariert und von da an im gesamten Script sichtbar, also auch im Package bar. Die Variable $foo_loc ist via my als lokal innerhalb des Packages bar deklariert mit der Besonderheit, dass sie außerhalb von bar nicht sichtbar ist, während $foo_glob zwar auch lokal in bar ist, aber durch die Deklaration via our nach außen sichtbar ist. Um auf $foo_glob außerhalb von bar zuzugreifen, notiert man den Namensraum davor (also $bar::foo_glob). Jede Manipulation an $foo_glob, auch außerhalb von bar, hat Auswirkungen auch innerhalb von bar:
Ciao
Kurt