CPAN: Array als Membervariable

Beitrag lesen

Also dereferenzieren wir das Array vor dem Zugriff:
    @$self->{'windows'}

Es muss @{ $self->{'windows'} } heißen. Hättest du perlcritic eingesetzt, monierte es dir diese Verwendung von Doppelsigiln.

Was denn nun?

Du hattest eine Meinungsverschiedenheit mit Perl über die Rangreihenfolge der Dereferenzierung. Perl gewinnt immer in Meinungsverschiedenheiten. Es ist immer eine gute Idee, so zu programmieren, dass Meinungsverschiedenheiten nicht im Code auftreten können. Werkzeuge und Praktiken helfen dir dabei. Setze sie ein.

Naja, befüllen wir das Objekt also ganz direkt, erstmal mit einem leeren Array.
    sub new { bless {'windows' => ()}, shift; }

Das ist nicht sinnvoll. Dein Objekt ist hashbasiert. Schlüssel und Werte in einem Hash sind immer skalare Werte. Du hast da eine (leere) Liste. Listen sind nicht skalar. Du musst eine (leere) Arrayreferenz einsetzen. Dies ist, wie alle Referenzen, ein skalarer Wert.
    sub new { bless {'windows' => []}, shift; }

Der Fehler wäre dir von allein aufgefallen, wenn du zuerst einen Hash erzeugt hättest, anstatt gleich eine anonyme Referenz zu blessen.
    ~~~perl

use warnings;
    my %obj = (
        'windows' => ('a', 'b')
    );

Odd number of elements in hash assignment at…


> Scheinbar habe ich hier wohl etwas ganz elementares nicht verstanden.  

Referenzen bzw. deren korrekte Verwendung. Bitte schlage das in deinem Perllehrbuch oder in der Dokumentation nach.  
  
Hausaufgabe: Erkläre die Warnung im vorletzten Absatz!