Thread Konstruktor mit einer Hashliste die ein Array beinhaltet? (16 answers)
Opened by MGlutaeus at 2008-12-10 16:36

pktm
 2008-12-12 12:45
#117120 #117120
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ok, nochmla ganz wichtig: Array deklariert man mit *runden* Klammern:
Code: (dl )
1
2
3
my @array = ();
my @array2 = qw(1 2 4 5);
print $array2[0]; # Zugriff mit $


Hashes auch:
Code: (dl )
1
2
3
4
5
my %hash = ();
my %h2 = (
key => 'value',
);
print $h2{'key'}; # Zugriff mit $ und dem Schlüssel


Hashreferenzen deklariert man mit geschweiften Klammern:
Code: (dl )
1
2
3
4
5
my $hashref = {};
my $hashref2 = {
key => 'value',
};
print $hashref->{'key'}; # Zugriff mit $ + Dereferenzierung (->).


Arrays kannst du nicht in einem Hash als Wert speichern. Aber du kannst eine Referenz darauf speichern:
Code: (dl )
1
2
3
4
5
6
my @a = qw(1 2 3);
my %h = (
'key' => \@a,
);

print $h{'key'}->[0]; # Gibt das 1. Element von @a aus.


Zu Referenzen musst du dir perldoc perlref durchlesen. Da kommst du nicht drumherum. Das ist so grundlegend wie Variablenzuweisung.

Konstruktoren sind in Perl nicht vordefiniert, genausowenig this. Wenn du eine Methode aufrufst:
Code: (dl )
$objekt->method();


dann ist das erste Argument des Aufrufs das, was links vom -> steht, nämlich $objekt. Und das ist auch das, was du immer als erstes in den Methoden auslesen solltest:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
=head2 method()

Deine Beschreibung der Methode. Funktioniert so ähnlich wie Doxygen, nennt sich aber POD.

=cut

sub method {
my $self = shift; # hier kommt deine Instanz, das links neben dem ->.

# TODO...

} # /method


Den Zugriff auf Klassenvariablen ohne Akzessor finde ich so hässlich wie das Wort Akzessor :)
Hier mein Vorschlag:
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
package Ca; # Großbuchstabe vorne dran!
use strict;
use warnings;
use base qw(Class::Accessor);
__PACKAGE__->mk_accessors(qw(instability));

#our $instability = 4; # wird im Konstruktor gesetzt.

=head1 METHODS

=head2 new( $dimension, $iniTime, $finTime, $rndInit, $useNorth, $useDiagonal )

TODO: Deine Beschreibung des Objetes, das man mit new() konstruiert, hier.

=cut

sub new {
my $class = shift;
my ( $dimension, $iniTime, $finTime, $rndInit, $useNorth, $useDiagonal ) = @_;

# TODO: Prüfen der Argumente

my @cellList = ();

my $some_data = {
dim => $dimension,
iniTime => $iniTime,
finTime => $finTime,
rndInit => $rndInit,
useNorth => $useNorth,
useDiagnoal => $useDiagonal,
cellList => \@cellList,
# alternativ: anonyme Arrayreferenz
#cellList => [],
};

my $self = bless ($some_data, $class);

# init instability:
$self->instability(4);
# get this value anywhere else by calling my $inst = $obj->instability();

$self->addCells();
$self->addCellsNeighbors();

return $self;
} # /new

1; # Semikolon dran!
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread Konstruktor mit einer Hashliste die ein Array beinhaltet?