Schrift
[thread]10983[/thread]

bless-Frage

Tags: Ähnliche Threads

Leser: 4


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Froschpopo
 2007-12-09 13:43
#103647 #103647
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hab hier folgendes Modul gestrickt:
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
package MyModul;

use strict;

sub new {
        my $class = shift;
        my $self = {};
        bless($self, $class);
        #$self->init(@_) # Startparameter nach $self einlesen
        return $self;
}

sub search {
        my $self = shift;
        my $name = shift;
        my $names = {};
        $names->{_NAME_} = $name;
        bless($names);
}

sub get {
        my $names = shift;
        # ich hätte hier gerne noch $self aus new()
        print $names->{_NAME_};
}

1;


Und das wird so eingesetzt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
use strict;
use MyModul;

my $objekt = MyModul->new;

my $name1 = $objekt->search('Thomas');
my $name2 = $objekt->search('Martin');

print $name1->get,"\n";             #Thomas
print $name2->get,"\n";             #Martin


Meine Frage bezieht sich auf das Package und lautet folgendermaßen:

Wie übergebe ich den $self-Hash der in new() deklariert wurde an get()?
lichtkind
 2007-12-09 14:15
#103651 #103651
User since
2004-03-22
5680 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
der erste parameter den get bekommt ist imer das objekt selbst und da hast du ja schon den hash, oder?
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Froschpopo
 2007-12-09 14:17
#103652 #103652
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
get() bekommt zuerst $names, weil search() ein eigenes Objekt erzeugt.

Das Script hat soweit meine Kenntnis reicht keine Fehler. Ich weiss nur nicht, wie ich $self nach get() rüberkriege!

Wie man sieht, möchte ich für jedes Objekt das durch search() erzeugt wird einen eigenen Hash haben. Ich brauche aber auch den allgemeinen $self-Hash, weil dort wichtige Informationen festgehalten werden.
renee
 2007-12-09 14:21
#103653 #103653
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann musst Du wohl search umschreiben...

Der erste Parameter beim Aufruf "$self->..." ist immer $self!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2007-12-09 14:24
#103654 #103654
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
renee+2007-12-09 13:21:54--
Der erste Parameter beim Aufruf "$self->..." ist immer $self!


Die Reihenfolge ist mir wurst. Ich brauche aber beide!
Quasi so:
Code (perl): (dl )
1
2
3
4
sub get {
    my $self = shift;     #allgemeine Daten
    my $names = shift;   #Daten, die nur für das Objekt gültig sind das in search() erzeugt wird
}


Aber wie wird das übergeben?
renee
 2007-12-09 15:05
#103658 #103658
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Durch das $self->... übergibt Perl das automatisch als ersten Parameter...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2007-12-09 15:08
#103659 #103659
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
$self wird nicht an get() übergeben!
Es gibt nur einen Parameter und das ist der $names-Hash! Ist ja auch logisch, weil nur der wird an bless übergeben!
topeg
 2007-12-09 15:20
#103660 #103660
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Warum 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/perl

use strict;
use warnings;

#######################################################
package MyModul;

sub new
{
 my $class = shift;
 my $self = {};
 bless($self, $class);
 return $self;
}

sub search
{
 my $self = shift;
 my $name = shift;
 return MyModul::Search->new($name);
}

1;
#######################################################
package MyModul::Search;
use base 'MyModul';

sub new
{
 my $class = shift;
 my $name = shift;
 my $self = {'_NAME_'=>$name};
 bless($self, $class);
 return $self;
}

sub get
{
 my $self=shift;
 return $self->{'_NAME_'}; 
}

1;
#######################################################
package main;

my $test=MyModul->new();

my $name_a=$test->search('NAME1');
print $name_a->get()."\n";
Froschpopo
 2007-12-09 15:44
#103661 #103661
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Dann muss ich aber in MyModule::Search den $self aus MyModule irgendwie importieren und der existiert dann doppelt gemoppelt!
Froschpopo
 2007-12-09 20:00
#103666 #103666
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Habs jetzt so gelöst:
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
44
45
46
47
48
49
50
51
52
53
54
package Friender::EasyDB;

use strict;
use DBI;
use Friender::Search::Search;

sub new {
        my $class = shift;
        my $self = {};
        bless($self, $class);
        $self->init(@_);
        return $self;
}

sub init {
        my $self = shift;
        my $dbh = DBI->connect_cached(@_,
                {
                        AutoCommit => 0,
                        RaiseError => 1
                }
        )
                or die $DBI::errstr;
        $self->{_DATA_}->{DBH} = $dbh;
}

sub search {
        my $self = shift;
        my $dbh = $self->{_DATA_}->{DBH};
        my ($st, @bind) = @_;
        return Friender::Search::Search->new($dbh, $st, @bind);
}

sub quick {
        my $self = shift;
        my $dbh = $self->{_DATA_}->{DBH};
        my ($st, @bind) = @_;
        return $dbh->selectrow_array($st, undef, @bind);
}

sub do {
        my $self = shift;
        my $dbh = $self->{_DATA_}->{DBH};
        my ($st, @bind) = @_;
        $dbh->do($st, undef, @bind);
}

sub disconnect {
        my $self = shift;
        my $dbh = $self->{_DATA_}->{DBH};
        $dbh->disconnect;
}

1;


und das "Child"-Modul, wie ich es mal nenne, sieht so aus:
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
package Friender::Search::Search;

use strict;
use SQL::Abstract;

sub new {
        my $class = shift;
        my $self = {};
        bless($self, $class);
        $self->init(@_);
        return $self;
}

sub init {
        my $self = shift;
        my ($dbh, $st, @bind) = @_;
        my $sth = $dbh->prepare($st);
        $sth->execute(@bind)
                or die $DBI::errstr;
        $self->{_DATA_}->{RESULTS} = $sth;

}

sub get {
        my $self = shift;
        my $sth = $self->{_DATA_}->{RESULTS};
        return $sth->fetchrow_hashref;
}

1;


UND was hält man davon?
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2007-12-09 13:43.