Schrift
[thread]9909[/thread]

Allgemeine Frage zu Modulen

Leser: 1


<< >> 5 Einträge, 1 Seite
Gast Gast
 2007-08-01 12:02
#91594 #91594
Hallo Perl-Gemeinde ;)

versuche mich gerade an Perl zu gewöhnen. Und benötige da, glaube ich, etwas proffisionelle Hilfe.

Habe volgende Konstellation (vereinfacht dargestellt):

Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;

use module::Main;

die print "Programmfehler!" unless Main::Run();


module/Main.pm
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Main;

use strict;
use warnings;

use module::Config;

our $Config = new Config;

sub Run
{
        return -1 unless $Config->Start();
        return 1;
}


module/Config.pm
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package Config;

use strict;
use warnings;

use Tk;
use module::Navi;

sub new
{
        my ($this) = @_;
        bless my $self = {} => (ref $this) || $this;
        
        $self->{mw} = new MainWindow;
        my $fr1 = $self->{mw}->Frame->pack;
        
        return undef unless
                $self->{Navi} = new Navi($fr1);
        
        $self->{Navi}->SetCallBackEvent(\&ViewEvent);
}

sub Start
{
        MainLoop();
}

sub ViewEvent
{
        my($this) = @_; # !!! $this - Kein Objekt. Hä ???
}


module/Navi.pm
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package Navi;

use strict;
use warnings;

use Tk::Tree;

my $EventHandler = undef;

sub new
{
        my($this, $top) = @_;
        
        bless my $self = {} => (ref $this) || $this;
        $self->{tree} = $top->Scrolled
        (
                qw/Tree/
        )
                ->pack;
        
        $self->{tree}->bind('<ButtonPress-1>', [ \&TreeEvent ]);
        $self->{tree}->bind('<KeyPress>'     , [ \&TreeEvent ]);

        #
        # Hier Tree befüllen
        #
        $self->{tree}->autosetmode;
}

sub TreeEvent
{
        my($this) = @_; # !!! Nicht Objekt, sondern Tree=HASH(...) ???
        
        return unless my $sl = $this->info('selection');
    
        &$EventHandler($this->info('data', $sl));
}

sub SetCallBackEvent
{
        my($this, $event) = @_; # Hier $this - o.k.
        $EventHandler = $event;
}


Was mache ich falsch? Warum erhalte ich nicht die Objekt-Referenzen in den Subs?

Bitte um Aufklärung *help*

Vielen Dank!
Alex
Strat
 2007-08-01 13:08
#97056 #97056
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Quote
Main::Run();

In welchem Namensraum ist die Sub Run?
Code: (dl )
module::Main::Run();


Nebenbei: ich schlage folgende Verbesserungen vor:

x) Anstelle von module besser was gross-geschriebenes verwenden, z.B. MyApp

x) our $Config = new Config; was passiert, wenn es im aktuellen Namensraum eine Sub namens new oder Config gibt? our $Config = Config->new ist sicherer;

x) Konstruktor in module::Config:
Code: (dl )
1
2
my ($this) = @_;
bless my $self = {} => (ref $this) || $this;


Willst du da wirklich einen dualen Konstruktor haben, dem man sowohl eine Klasse als auch ein Objekt reinwerfen kann? Meiner Meinung nach sollte ein Konstruktor lediglich einen Klassennamen aufnehmen, und wenn man einen Clone-Konstruktor benoetigt, sollte man ihn auch clone oder so nennen.
Also:
Code: (dl )
1
2
my( $class ) = @_;
my $self = bless( {}, $class );


x) return undef unless ...
kann unter umstaenden gefaehrlich werden, wenn diese Funktion im Listenkontext aufgerufen wird; dann wird eine Liste mit einem Element zurueckgegeben. besser
Code: (dl )
return unless ...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2007-08-01 13:38
#97071 #97071
O.K. Vielen Dank für die Info's :)

Ich werde mein Code überarbeiten... und berichten...

Aber bitte nicht erwarten dass ich alles verstanden habe. Perl ist nicht gerade einfach zu verstehen. Aber es ist sehr bequem damit zu programmieren (wenn man weiß, was man da macht ;)).

Ich glaube, ich fange an Perl zu mögen ^^

Danke nochmal!

Alex
bloonix
 2007-08-01 14:22
#97077 #97077
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code (perl): (dl )
1
2
3
use module::Main;
...
package Main;

ändere alle package's mal wie folgt um:

Code: (dl )
package module::Main;


Und in jedem Modul sollte eine "1;" am Ende stehen.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Gast Gast
 2007-08-01 15:46
#97107 #97107
Alles klar :)

Habe alles soweit angepasst. Und es funktioniert *freu*

Soweit alles klar mit Namensräumen. Habe auch mal gelesen, dass hier unterschiedliche HASH-Tabellen verwaltet werde...

Habe da allerdings noch eine kleine Verständnisfrage. Eine sub sollte doch immer automatisch als ersten Parameter die Objekt-Referenz erhalten (habe noch nichts anderes gehört oder gelesen). Leider ist dem aber nicht so :(
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package activ_db::Config;

# ... wie gehabt

# hier Zeiger auf das Objekt - muss das wirklich sein :(
my $Me = undef;

sub new
{
    my ($class) = @_;
    $Me = bless({}, $class);
    
    # Rest wie gehabt ...
}

sub ViewEvent
{
    my($view) = @_;     # Hier kein Objekt !
    
    if($view == 1001) # $view ist korrekt (gibt immer eine zahl)
    {
        # keine $self in der sub :(
        $Me->{Daten} = new activ_db::DatenControl($Me->{daten_frame})
            unless ($Me->{Daten});
    }
}


Aufgerufen wird ViewEvent aus dem Objekt Navi:
Code (perl): (dl )
1
2
3
4
5
6
7
sub TreeEvent
{
    my($tree) = @_;
        
    return unless my $sl = $tree->info('selection');
    &$EventHandler($tree->info('data', $sl)) if $EventHandler;
}


Ist das so korrekt? Muss man hier mit einer Hilfs-Variable arbeiten?

Vielen Dank!

Alex

PS: Habe mich registrieren lassen. Leider noch keine Zugangsdaten, da private Mail angegeben. Finde das Forum einfach Klasse ;)
<< >> 5 Einträge, 1 Seite



View all threads created 2007-08-01 12:02.