Thread Zugriff auf anderes Package (klappt nicht) (12 answers)
Opened by Gast at 2008-04-27 01:10

KurtZ
 2008-04-28 00:29
#108920 #108920
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Gast+2008-04-27 21:29:59--
Ach so. Das heißt, wenn ich die Variable in einem Modul verwenden will (was ich vor habe) muss ich sie zwangsläufig per $Packagename::Variablenname aufrufen?


du kannst mal ein ziemlich langes Streitgespräch dazu nachlesenKonzept der Namensräume; Global, Dynamic und Lexical Scope , steht leider auch öfters was falsches drin, achte deswegen auf die Chronologie.

Die Kurzform

Es gibt 2 Arten von Variablen in Perl, welche Sorte du verwendest hängt von der letzten Deklaration im gleichen Scope ab.
(Ohne use strict sind undeklarierte Variablen automatisch Packagevariablen, mit use strict muss jeder Variablenname deklariert werden.)

Packagevariablen sind Variablen die in öffentlichen Namensräumen abgelegt werden (auch Dateiübergreifend nutzbar)
Lexikalische Variablen werden in einem unbenannten, privaten Raum des Geltungsbereich (Scope) abgelegt, also der umgebende Klammernblock oder Funktion, maximal aber die aktuelle Datei.
Deklarationen wirken nur in ihrem Geltungsbereich (wie gesagt maximal aktuelle Datei) und müssen außerhalb falls nötig wiederholt werden.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package xxx;
{ 
# Blockstart
    our $public;
    my $private;
    # in diesem Blockscope ist jedes $public als Kurzschreibung für $xxx::public deklariert
    # in diesem Blockscope ist jedes $private als lexikalisch deklariert,
    # und wird privat beim Blockscope gespeichert, absolut unabhängig vom Package 
}
# Blockende

# $private existiert nicht mehr, weil sein Scope verlassen wurde, Zugriff (ohne "Schmuggelaktionen") ist unmöglich

# hier ist der kurze Variablenname $public undeklariert
# ich kann aber immer noch problemlos auf die Variable $xxx::public zugreifen
# auch aus einer anderen Datei


um letztendlich deine Frage zu beantworten:

Solange in deinem aktuellen Scope auf ein package Packagename ein our $variablenname folgt, kannst du im ganzen Scope $variablenname statt $Packagename::variablenname schreiben.

Steht das am Anfang der Datei, gilt das sogar für die ganze Datei (äußerster Scope) siehe auch perldoc -f our
TMTOWTDYOG (there's more than one way to dig your own grave)

View full thread Zugriff auf anderes Package (klappt nicht)