Schrift
[thread]7241[/thread]

Array als Objektvariable



<< >> 7 Einträge, 1 Seite
Robse
 2005-08-29 19:13
#57503 #57503
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Hallo, ich möchte ein Array als Objektvariable halten.
Eine Objektmethode soll dem Array ein Element hinzufügen.
Hier ist mein code bisher:
Test.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
sub new
{
       my $package = shift;
       my $self = bless{ testarray => undef }, $package;
       return $self;
}

sub testfunc
{
       my $self = shift;
       my $var = shift;

       my @testarray = $self->testarray();

       push(@testarray, $var);

       $self->testarray(@testarray);

       for(my $i = 0; $i < scalar(@testarray); $i++)
       {
               warn $i . "=" . $testarray[$i];
       }
}

sub testarray {
 my $self = shift;
 if (@_) {
   $self->{"testarray"} = shift;
 }
 return $self->{"testarray"};
}


test.pl
Code: (dl )
1
2
3
4
my $obj = MHMod::Test->new();

$obj->testfunc("a");
$obj->testfunc("b");

Das angehängte Element geht jedoch zwischen den Methodenaufrufen "verloren"
Es handelt sich wohl um ein Referenzproblem? Wie muss
ich den Code ändern?\n\n

<!--EDIT|Robse|1125328557-->
Strat
 2005-08-29 19:39
#57504 #57504
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
 return $self->{"testarray"}; # gibt eine arrayreferenz zurueck

my @testarray = $self->testarray(); # weist die arrayreferenz $testarray[0] zu

entweder als liste zurueckgeben:
Code: (dl )
1
2
3
return @{  $self->{"testarray"} };

my @testarray = $self->testarray();

oder gleich mit der referenz arbeiten (braucht weniger ram, ist aber etwas komplizierter):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
return $self->{"testarray"};

my $testarrayRef = $self->testarray();
push(@$testarrayRef, $var);

# wenn du mit referenz arbeitest, brauchst du das nicht mehr,
# weil du die daten direkt veraenderst, wenn du mit der ref arbeitest
# $self->testarray(@$testarrayRef);

for my $i (0 .. $#$testarrayRef) {
 warn $i . "=" . $testarrayRef->[$i];
}

oder so aehnlich

nebenbei: du kannst auch anstelle des hashes eine arrayreferenz blessen und so als objekt verwenden:
Code: (dl )
my $self = bless([], $class);

manchmal reicht auch das\n\n

<!--EDIT|Strat|1125330203-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Relais
 2005-08-29 19:44
#57505 #57505
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hmm.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub new {
my $package = shift;
my $self = { testarray => [ ] };
bless $self, $package;
return $self;
}

sub testmethod {
my ( $self, $var ) = @_;

my @testarray = @{ $self->testarray }; # dereferenzieren

push(@testarray, $var);

$self->testarray( [ @testarray ] ); # referenzieren

for(my $i = 0; $i < scalar(@testarray); $i++)
{
warn $i . "=" . $testarray[$i];
}
}


Nützlich sind perldoc perlref, perldoc perllol, perldoc perldsc zu Rate zu ziehen.\n\n

<!--EDIT|Relais|1125332650-->
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Taulmarill
 2005-08-29 19:49
#57506 #57506
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
was haltet ihr von folgendem?
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
use strict;
use warnings;

package Foo;

sub new {
my $class = shift;
my $self = { testarray => [] };
bless $self, $class;
return $self;
}

sub testfunc {
my $self = shift;
my $var = shift;

push( @{$self->{testarray}}, $var );
return 1;
}

sub list {
my $self = shift;
return @{$self->{testarray}};
}

package main;

my $foo = new Foo;

$foo->testfunc("a");
$foo->testfunc("b");
print $foo->list, "\n";


ich würde die anschaffung von "Einführung in Perl-Objekte, Referenzen & Module" dringend anraten
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Robse
 2005-08-29 20:19
#57507 #57507
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Danke für die hilfreichen Antworten, jetzt ist das schon einiges klarer!
Crian
 2005-08-30 15:00
#57508 #57508
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Man kann statt Hashreferenzen auch Referenzen auf Arrays oder Skalare blessen. Hab beides schonmal anwenden können.\n\n

<!--EDIT|Crian|1125402734-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sri
 2005-08-30 16:14
#57509 #57509
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my $a = MyArray->new;

$a->testfunc('foo');
$a->testfunc('bar');
$a->testfunc('baz');

print "$_\n" for $a->list;

package MyArray;

sub new { bless [], shift }

sub testfunc { push @{ $_[0] }, $_[1] }

sub list { @{ $_[0] } }

1;
<< >> 7 Einträge, 1 Seite



View all threads created 2005-08-29 19:13.