Struppi: Getter/Setter

Beitrag lesen

wie lernen z.Z. absolute Basics in Perl und bei mir scheitert es schon bei einem Variablenaufruf eines anderen Packages.

Du solltest dir mal die Basics der Perldokumentation anschauen
http://perldoc.perl.org/perlboot.html
http://perldoc.perl.org/perltoot.html
http://perldoc.perl.org/perlbot.html

Dein Problem ist, dass du denkst eine package Variabel ist ein Member einer Klasse. Dem ist aber nicht so, viel mehr entspricht dein %hastable einer statischen Variabel, die in allen Instanzen identisch ist.

Ich will ja in meiner Main auf den Hash zugreifen und ihn ändern können. und im Prinzip etwas schreiben wie:

package main;

my $Method = new Method;
my $2Method = new Method;
my $combinatorics = new Combinatorics;
$combinatorics::%hashtable = ($Method=>$2Method)


>   
>   
> Falls es irgendjemandem helfen sollte mein Problem zu verstehen;  
> In C# würd ich,um das selbe zu realisieren, schreiben:  
>   
>   
> public class Combinatorics {  
>   
> Dictionary <initialize,initialize> hashtable = new Dictionary <initialize,initialize>();  
>   
> }  
> Method method = new Method();  
> Method 2method = new Method();  
> Combinatorics combinatorics = new Combinatorics();  
>   
>   
> combinatorics.hashtable.Add(method,2method)  
>   
  
  
In Perl (Version <6) gibt es keine Klassen in dem Sinne, wie es OOP Sprachen umsetzen. Der einfachste Weg dort ist es einen Hash mittels bless an ein package zu binden. Das bedeutet, dass %hashtable keine package sein darf, sondern eine Eigenschaft des gebundenen Hash. Was aber in deinem Grundgerüst etwas schwieriger ist, weil du eine Basisklasse definiert hast.  
  
~~~perl
package Combinatorics;  
use parent 'initialize'; # parent ist besser als base  
  
sub new {  
   my $self = shift->SUPER::new(@_);  
   $self->{hashtable} = {};  
   return $self;  
}  

Bei dem Rest deines Beispiel Codes erkenne ich nicht ganz, was du da machen willst. Wenn es nur um den Zugriff geht, sieht es so aus:

package main;  
  
my $Method = new Method;  
my $2Method = new Method;  
my $combinatorics = new Combinatorics;  
$combinatorics->{hashtable} = ($Method=>$2Method);  

Wobei das wenig Sinn macht, da du so dem Hash eine Liste mit einem Element zuweist (bei eingeschalteten Warnungen wird dir das so ausgegeben).

Auch ist es nicht schön, auf Attribut so zu zugreifen. Da Perl keine privaten Attribute kennt, sollte man sich darauf einigen auf diese möglichst nicht direkt zu zugreifen und das ganze über Memberfunktionen zu regeln.

Und um den Einwürfen unseres lieben Forumskollegen CPAN zuvor zu kommen. Perl 6 ist auf dem Weg und der Perlfachmann spricht mittlerweile von modern Perl, in diesem Kontext wird u.a. das Modul Moose für Objektorientierte Perlprogrammierung empfohlen.

Struppi.
Struppi.