Schrift
[thread]8617[/thread]

Objekt in Objekt ohne dessen Referenz bearbeiten?



<< >> 6 Einträge, 1 Seite
toby
 2007-01-02 00:37
#72854 #72854
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo,

wie kann ich ein Attribut aus einem Objekt, welches in einem "VaterObjekt" drin ist auslesen, ohne dass mir die ursprüngliche Referenz auf das "embded"-Objekt zur Verfügung steht?

Beispiel: Ich habe ein Objekt, welches mehrere weitere Objekte "beinhaltet". Die weiteren Objekte wurden z.B. beim Einlesen der Konfiguration erstellt und ins Vaterobjekt eingesetzt. Die Variablen mit den Referenzen auf diese Objekte waren lokale Variablen, die in den Objektmethoden, während die Objekte erstellt wurden, erzeugt wurden. Diese Variablen mit den Referenzen sind nun natürlich nicht mehr existent, aber das Objekt ist da (hier ein Beispiel mit Dumper($my_obj) ):

Code: (dl )
1
2
3
4
5
6
7
$VAR1 = bless( {
'NAME' => [
bless( {
'STRING' => 'hello world'
}, 'Embded' )
]
}, 'Vater' );


Die 1000000-Frage lautet also: Wie komme ich an den Inhalt von STRING dran?

Danke! :)
T.\n\n

<!--EDIT|toby|1167691150-->
toby
 2007-01-02 00:46
#72855 #72855
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Es gibt nix besseres, als sich die Frage selbst zu beantworten ;)

Ich doffer! Ich bekomme doch die Referenz mit $self->{NAME} und dann kann ich wieder die Objektmethoden nutzen...

Sorry für doofes Posting :-/
T.

PS: Eine Forumfunktion "Beitrag Löschen" wäre nicht schlecht ;)\n\n

<!--EDIT|toby|1167691726-->
toby
 2007-01-02 01:21
#72856 #72856
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Oh man. Ich sollte lieber nachdenken und ausprobieren, bevor ich etwas poste. Ich war aber der Meinung, meine Idee aus dem Post vorhin löst mein Problem aus dem ersten Beitrag. Nun habe ich es auch ausprobiert und... es klappt nicht.

Der Code, der sich die Referenz "schnappt" und dann über eine Objektmethode auf den STRING zugreifen möchte sieht folgendermassen aus (Im Vaterobjekt.pm):

Code: (dl )
1
2
3
my $string=$self->{NAME};
printf "string:%s\n",Dumper($string);
printf "string:%s\n",$string->getString();


Beim Ausführen des Programmes bekomme ich zwar richtiges Dump des Embded-Objektes, allerdings beim Versuch eine Objektmehtode darauf auszuführen endet mit folgender Fehlermeldung:

Can't call method "getString" on unblessed reference at ...../Vater.pm

Daher gilt wieder die 1000000 ¤ Frage: Wie komme ich an "hello world" aus STRING, wenn mir das ganze Vaterobjekt mit den eingebetetten Kindsobjekten zur Verfügung steht?

Sorry, für dieses Durcheinander und danke für alle Tipps.
Tobias\n\n

<!--EDIT|toby|1167693821-->
sid burn
 2007-01-02 02:49
#72857 #72857
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hmm, ungefähr soetwas suchst du?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $VAR1 = bless( {
'NAME' => [
bless( {
'STRING' => 'hello world'
}, 'Embded' )
]
}, 'Vater' );


print $VAR1->{NAME}->[0]->{STRING}, "\n";
print $VAR1->{NAME}[0]{STRING}, "\n";

my $object = $VAR1->{NAME}[0];
print $object->{STRING}, "\n";


Das gibt 3 mal den String "hello world" aus.

Beim unteren Beispiel habe ich das innere Objekt in die Variable $object gespeichert. Du kannst dann anstatt es zu dereferenzieren und direkt auf die innereien zuzugreifen auch wieder die Methoden des Objekt Benutzen.




Ansonsten hast du wohl bei dir vergessen nochmals zu derefernzieren. NAME zeigt bei dir auf ein Annonymes Array das als erstes Element dein inneres Objekt enthält.

Anscheind sollte das wohl unbeabsichtigt sein, ich denke du wolltest wohl eher das NAME direkt auf das Objekt zeigt. Dafür musst du dann deinen Code anpassen womit du das ganze Konstrukt überhaupt erzeugt hast.\n\n

<!--EDIT|sid burn|1167699115-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2007-01-02 12:11
#72858 #72858
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es ist hässlich, auf die inneren Sachen eines Objektes direkt zuzugreifen. Da ist der zweite Lösungsansatz von sid burn der wesentlich bessere...
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/
Ronnie
 2007-01-02 14:02
#72859 #72859
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich würde auch entsprechende Accessor-methoden empfehlen:
Code: (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
#!/usr/bin/perl

use strict;
use warnings;

package Child;
use Moose;

has 'name' => (is => 'rw');

package Father;
use Moose;

has 'name' => (is => 'rw');
has 'children' => (is => 'rw', isa => 'ArrayRef');

use overload '+' => \&add,
'""' => \&to_s;

sub add {
my $self = shift;
push @{$self->{children}}, shift @_;
}

sub to_s {
my $self = shift;
my $sons = '';
$sons .= $_->name . ", " for @{$self->children};
$sons =~ s/\,\s(\w+)\,\s?$/ and $1/;
return $self->name . " and his sons: " . $sons;
}

package main;
no warnings;

my $son = Child->new(name => 'Jackson');
my $son2 = Child->new(name => 'Jim');
my $dad = Father->new(name => 'Jack');
$dad + $son;
$dad + $son2;

print $dad;

EDIT: Wenn die warnings stören, dann muss man auf overload verzichten.
EDIT2: Wenn schon overload, dann auch für: "".\n\n

<!--EDIT|Ronnie|1167752406-->
<< >> 6 Einträge, 1 Seite



View all threads created 2007-01-02 00:37.