Hallo Leute,
im Rahmen einer kleineren Aufgabe wollte ich mir soeben schnell ein Perl-Script basteln, das die Fleißarbeit übernimmt. Ich habe meinen Quellcode für hier mal heruntergebrochen auf den entscheidenden Teil.
sub new
{
my @a = ('a', 'b');
bless {'windows' => \@a}, shift;
}
sub print
{
my $self = shift;
print "Elemente: " . $self->{'windows'} . "\n";
}
Ausgabe, wie erwartet: Elemente: ARRAY(0x6aeb9c)
Also dereferenzieren wir das Array vor dem Zugriff:
sub new
{
my @a = ('a', 'b');
bless {'windows' => \@a}, shift;
}
sub print
{
my $self = shift;
print "Elemente: " . @$self->{'windows'} . "\n";
}
Ausgabe: Not an ARRAY reference at blabla.pm line 12.
Was denn nun? Naja, befüllen wir das Objekt also ganz direkt, erstmal mit einem leeren Array.
sub new { bless {'windows' => ()}, shift; }
sub print
{
my $self = shift;
print "Elemente (" . $self->{'windows'} . "): " . join(',', $self->{'windows'}) . "\n";
$i = 0;
print "\tElement " . $i++ . ": " . $_ . "\n" foreach $self->{'windows'};
}
Erwartete Ausgabe:
Elemente (0):
Tatsächliche Ausgabe:
Elemente ():
Element 0:
Die foreach-Schleife läuft also einen Schritt durch das leere Array? Naja, also können wir es ja mal füllen und schauen, was dann passiert.
sub new { bless {'windows' => ('a', 'b')}, shift; }
sub print
{
my $self = shift;
print "Elemente (" . $self->{'windows'} . "): " . join(',', $self->{'windows'}) . "\n";
$i = 0;
print "\tElement " . $i++ . ": " . $_ . "\n" foreach $self->{'windows'};
}
Erwartete Ausgabe:
Elemente (2): a,b
Element 0: a
Element 1: b
Ausgabe:
Elemente (a): a
Element 0: a
Das zweite Element fehlt einfach, und bei der Konvertierung des Arrays in einen Skalar wird das erste Element zurückgegeben, statt der Länge? Vielleicht haut ja hier etwas mit dem Objekt selber nicht hin. Speichern wir mal testweise einen String, statt ein Array.
sub new { bless {'windows' => 'Hello'}, shift; }
sub print
{
my $self = shift;
print $self->{'windows'} . " world!\n";
}
Ausgabe, wie erwartet: Hello world!
Also, entweder die Welt ist durchgeknallt, oder ich. Scheinbar habe ich hier wohl etwas ganz elementares nicht verstanden. Es muss doch möglich sein, ein Array in einem Objekt zu speichern?
Johannes