Schrift
[thread]6303[/thread]

Variablen aus Paket in Skript verwenden: Brett vor Kopf

Leser: 2


<< >> 9 Einträge, 1 Seite
Crian
 2004-06-02 13:46
#82902 #82902
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Ich bin wohl auch noch nicht so ganz fit (wink q renee ;-) ...

Eigentlich ganz einfach: Ich hab ein Modul, in dem es globale Hashes gibt.

Ich dachte, ich könnte (nach use Modul) mit %Modulname::Hashname darauf zugreifen, das geht aber nicht, bzw. sie sind leer von außen betrachtet.

Ich glaub es ist ganz einfach, und ich hab nur ein Brett vorm Kopf ... hilft mir mal wer auf die Sprünge bitte? 8-}
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2004-06-02 14:19
#82903 #82903
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wenn es globale hashes in Modulname gibt, dann sollte
%Modulname::Hashname darauf zugreifen. wie hast
du denn die hashes definiert? mit use vars? mit our?
mit my?
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
Crian
 2004-06-02 14:22
#82904 #82904
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Ich hab mir jetzt mit kleinen Hilfsfunktionen beholfen, ist zur Datenkapselung eh besser *einred*.


Hab vorher die ganze Zeit das Modul geändert und geändert ohne Wirkung, bis ich feststellen musste, das es zwei verschiedene Dateien des gleichen Moduls waren, ich hab nicht die geändert, die gerade angezogen wurde, sondern die, die hätte angezogen werden sollen, wenn ich das fertige(re) Skript an seinen Bestimmungsort kopiere. *seufz*

[quote=pq,02.06.2004, 12:19]wenn es globale hashes in Modulname gibt, dann sollte
%Modulname::Hashname darauf zugreifen. wie hast
du denn die hashes definiert? mit use vars? mit our?
mit my?[/quote]
Erst waren sie mit my definiert, dann hab ich es mit our versucht, ohne Erfolg (hab nicht in der Datei geändert, die ich anzog ^^). Das hätte aber doch dann eigentlich gehen sollen, oder?\n\n

<!--EDIT|Crian|1086173355-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2004-06-02 15:22
#82905 #82905
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
etwas code, bitte...
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
Crian
 2004-06-02 20:01
#82906 #82906
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Es sind globale Hashes im Modul, mit my deklariert.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

package Paket;
use strict;
use warnings;

my  %NichtFuerDich    = ( blubb => 'blubber' );

our %DiesenVielleicht = ( daten => 'hier'    );

package main;
use strict;
use warnings;

use Data::Dumper;

print Dumper(\%Paket::NichtFuerDich), "\n";
print Dumper(\%Paket::DiesenVielleicht), "\n";


Ausgabe:

Code: (dl )
1
2
3
4
5
6
Name "Paket::NichtFuerDich" used only once: possible typo at C:\Daten\perl\forum\globale_paket_variablen_nutzen.pl line 17.
$VAR1 = {};

$VAR1 = {
         'daten' => 'hier'
       };


Wie ich mir dachte, mit our wärs gegangen, ich hatte nur in der falschen Datei auf our geändert und war verwirrt, weil das nichts bewirkte *g

P.S.: Ich habs in meinem Fall aber trotzdem bei my belassen und nur Testfunktionen nach außen angeboten, dann bin ich wenigstens sicher, dass mir keiner an den Hashinhalten rumpfuscht... ;)\n\n

<!--EDIT|Crian|1086192255-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2004-06-02 20:29
#82907 #82907
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Crian,02.06.2004, 18:01]Es sind globale Hashes im Modul, mit my deklariert.
[/quote]
das widerspricht sich. mit my() deklarierte variablen sind immer lexikal,
nie global. sie sind in diesem fall nur sichtbar im paket Paket.
Quote
Code: (dl )
1
2
3
4
5
our %DiesenVielleicht = ( daten => 'hier'    );
...
package main;
...
print Dumper(\%Paket::DiesenVielleicht), "\n";

das wiederum ist eigentlich doppelt gemoppelt.
wenn du den hash mit our() deklarierst, ist er überall (in diesem scope)
sichtbar, d.h. du kannst auch im package main ganz normal ohne Paket::
darauf zugreifen. das ist der unterschied zu 'use vars' -> use vars ist
package-bezogen, es kreiert also variablen, die über Paket::* angesprochen
werden. our dagegen sind packages egal.
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
Crian
 2004-06-04 15:02
#82908 #82908
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Aha. Im Gegensatz zum Beispiel sind bei mir Modul und Skript zwei verschiedene Dateien.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2004-06-05 01:58
#82909 #82909
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=pq,02.06.2004, 18:29]wenn du den hash mit our() deklarierst, ist er überall (in diesem scope)
sichtbar, d.h. du kannst auch im package main ganz normal ohne Paket::
darauf zugreifen. das ist der unterschied zu 'use vars' -> use vars ist
package-bezogen, es kreiert also variablen, die über Paket::* angesprochen
werden. our dagegen sind packages egal.[/quote]
das geht mit use vars genauso wie mit our... der einzige Unterschied zwischen our und use vars ist, dass our einen alias auf die packagevariable erzeugt, der lexikalisch ist. aber mit vollem paketnamen kommt man bei beiden immer dran...

und wie ich in einem anderen thread gelernt habe, funktioniert der our-ohne-package-aufruf ueber packagegrenzen hinweg nicht mit strict...\n\n

<!--EDIT|Strat|1086386335-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2004-06-05 15:35
#82910 #82910
Funktioniert aber bestens mit new($the_var) oder nach dem 'new' mit einem 'init'.
<< >> 9 Einträge, 1 Seite



View all threads created 2004-06-02 13:46.