Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6795[/thread]

Problem mit OOP: meine Klassen funktioniern nicht



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Peddn
 2005-03-16 14:05
#52710 #52710
User since
2003-12-21
33 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi Leute,

also hier meine Klasse 'TestClass.pm':

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package TestClass;

#######################################

# Klassenvariablen


# Konstruktor

sub new
{
my $object = shift();
my $reference = {};

bless($reference, $object);


# Objekt-Felder
$reference->{testFeld} = undef;

return($reference);
}


# --- Getter ---

sub get_arr_testFeld
{
my $object = shift();
return($object->{testFeld});
}


# --- Setter ---

sub set_arr_testFeld
{
my $object = shift();
my @metaTags = shift();

$object->{testFeld} = @testFeld;
}


# --- Methoden ---

sub printIt
{
my $object = shift();

print($object->get_arr_testFeld());
}


#######################################

1;


und hier das Testprogramm 'testClass.pl':

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

use strict;

use TestClass;

sub main
{
my $test = TestClass->new();

my @arr = ('<test val="blabla">hallo</test>', '123456', 'abcdef');

$test->set_arr_testFeld(@arr);

$test->printIt();

print($test->get_arr_testFeld());
}

&main();


Als Ausgabe erhalte ich:
Code: (dl )
00

Ich hätte natürlich gern den Inhalt des Arrays ;)
Was mach ich falsch?

Gruß,
Peddn
Taulmarill
 2005-03-16 14:12
#52711 #52711
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ändere mal im setter die zeile
Code: (dl )
$object->{testFeld} = @testFeld;

in
Code: (dl )
@{$object->{testFeld}} = @metaTags;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Taulmarill
 2005-03-16 14:14
#52712 #52712
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
achja, wenn du gleich bei der initialisierung festlegen willst, dass $reference->{testFeld} eine referenz auf einen array enthalten soll, dann kannst du das so machen:
Code: (dl )
$reference->{testFeld} = [];

das [] definiert dabei ein anonymes array.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Peddn
 2005-03-16 14:20
#52713 #52713
User since
2003-12-21
33 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok, warn Tippfehler, die Subroutine sieht jetzt so aus
Code: (dl )
1
2
3
4
5
6
7
sub set_arr_testFeld
{
my $object = shift();
my @testFeld = shift();

$object->{testFeld} = @testFeld;
}


Jetzt ist meine Ausgabe
Code: (dl )
11

;)

Ich verstehe nicht, warum ich nur zahlen bekomm, und warum '1'?
Ronnie
 2005-03-16 14:25
#52714 #52714
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Du verwendest bei der Zuweisung ein Array im skalaren Kontext, das wird nix. Verwende das von Taulmarill empfohlene anonyme Array - das sollte helfen.
Peddn
 2005-03-16 14:30
#52715 #52715
User since
2003-12-21
33 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok, hier nach mal die Klasse
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package TestClass;

#######################################

# Klassenvariablen


# Konstruktor

sub new
{
my $object = shift();
my $reference = {};

bless($reference, $object);


# Objekt-Felder
$reference->{testFeld} = [];

return($reference);
}


# --- Getter ---

sub get_arr_testFeld
{
my $object = shift();
return($object->{testFeld});
}


# --- Setter ---

sub set_arr_testFeld
{
my $object = shift();
my @testFeld = shift();

$object->{testFeld} = @testFeld;
}


# --- Methoden ---

sub printIt
{
my $object = shift();

print($object->get_arr_testFeld());
}


#######################################

1;


Leider hat die Änderung
Code: (dl )
$reference->{testFeld} = [];

nix geholfen. ich bekomm immernoch
Code: (dl )
11
:(
Ronnie
 2005-03-16 14:32
#52716 #52716
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Quote
my @testFeld = shift();

das wird nix, du bekommst nur das erste übergebene Element des Arrays. Du willst aber:
Code: (dl )
my @testFeld = @_;
\n\n

<!--EDIT|Ronnie|1110976394-->
renee
 2005-03-16 14:42
#52717 #52717
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde immer die Parameter zusammen abgreifen, also statt:
Code: (dl )
1
2
3
    my $object = shift();
my @testFeld = shift();


das hier:
Code: (dl )
my($object,@testFeld) = @_;


So kann man schon an der ersten Zeile erkennen, was als Parameter übergeben wird...

Ich habe teilweise schon Programme gesehen, die 10 Parameter übergeben und alles einzeln mit shift geholt haben und das auch noch über die gesamte sub verteilt! Da wird man wahnsinnig, wenn man einen Parameter noch einfügen will...
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
 2005-03-16 14:43
#52718 #52718
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
So mal ein vollständigeres Beispiel:
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
#!/usr/bin/perl

use strict;
use warnings;

package TestClass;
use Data::Dumper;

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

sub get {
my $self = shift;
return @$self;
}

sub set {
my $self = shift;
@$self = @_;
}

sub explode {
my $self = shift;
Dumper [$self->get()]; # print kommt an anderer Stelle. Danke an Renee!
}

package main;

my $object = new TestClass;
$object->set(qw (Hello World outside));
print $object->explode();
exit;

EDIT1: Beispiel etwas aufge'hübscht'.\n\n

<!--EDIT|Ronnie|1110978325-->
Peddn
 2005-03-16 14:44
#52719 #52719
User since
2003-12-21
33 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok, soweit alles klar... shift() liefert ja immer nur das erste übergebene Element...

jetzt versteh ich nur nicht wieso
Code: (dl )
print($test->get_arr_testFeld());

die Anzahl des gespeicherten Elemente im Array ausgibt (als 3) und
Code: (dl )
1
2
my @list1 = ("a", "b", "c");
print @list1;

folgendes ausgibt
Code: (dl )
abc
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-03-16 14:05.