Thread Debugging Hilfe bei Can't use string ("1") as a subroutine ref while "strict refs" in use (8 answers)
Opened by bianca at 2020-12-16 11:25

hlubenow
 2020-12-20 12:59
#193016 #193016
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
2020-12-20T09:32:03 bianca
Sehr gut geschrieben, flüssig lesbar.

Dankeschön! Freut mich, daß jemand sich damit beschäftigt.
2020-12-20T09:32:03 bianca
Ich arbeite schon lange mit Perl, habe aber nie eine große Tiefe erreicht.

Also ich finde, Deine Postings im allgemeinen zeigen schon, daß Du in Perl doch recht fortgeschritten bist.

Quote
[*]Im ganzen Text ist $classname nicht erklärt. Was ist das? Ist das der <Magie ein> Schalter?

Tja, sozusagen.
Vielleicht hätte ich noch beschreiben sollen, wie es zu dem Text gekommen ist: Ich hab' OOP über Python kennengelernt. Dann wollte ich auch wissen, wie man das in Perl macht. Ich hab' die Tutorials für Perl dazu gelesen (perldoc), und war davon völlig verwirrt.
Irgendwann dachte ich, "Kann man das nicht einfach so machen, wie man das in Python macht?" Und als ich gemerkt hab', ja, das kann man sehr wohl, hatte ich das Gefühl, das müßte mal jemand mit diesem Ansatz aufschreiben. Und das hab' ich dann gemacht.
In Python sieht Beispielskript 3 so aus:
Code (python): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python
# coding: utf-8

# OOP-Beispielskript 3

class Lamp:
 
    def __init__(self, wattzahl = 40, name = "Standardlampe"):
        self.wattzahl = wattzahl
        self.name     = name

    def zeigeWattzahl(self):
        print "'" + self.name + "' hat eine Birne mit " + str(self.wattzahl) + " Watt."

lamp = Lamp(wattzahl = 11)
lamp.zeigeWattzahl()

In der "Klassenmagie" (das ist mein eigener Begriff, der ist also nicht offiziell) gibt es in Python nicht dieses "$classname" (oder "$class", wie es in manchen Büchern auch genannt wird). Wenn man in Perl die Variable ausgibt, zeigt sie den Namen der Klasse (des packages), also "Lamp". Bei dem "->new()"-Aufruf hat man den ja gar nicht explizit mitgegeben. Also ist das schon in gewisser Weise "Magie". Die Variable wird dann für "bless()" verwendet.
Auch das, was "bless()" genau macht, ist für mich eher ein Geheimnis. Da ich das für meine Programme aber auch nicht brauche (ich kann es einfach benutzen), bin ich dem noch nicht im einzelnen nachgegangen.
Vielleicht weiß also jemand anders mehr darüber.
Quote
[*]Unter 5. steht im letzten Satz die Rückgabe mit "return". Wie sähe das aus und wofür bräuchte man das? Man hat doch die Möglichkeit, unendlich viele Attribute zu definieren.

Z.B. soll man in der OOP eigentlich nicht von außen auf die Attribute innerhalb einer Klasse zugreifen. Sondern man fragt bei einer Klasse nach dem Wert eines Attributs an, und die Klasse gibt einem den zurück. So eine Methode, die das macht, nennt man "Getter", und die hat dann sowas wie "return $self->{attribute};" am Ende (vgl. Zugriffsfunktion). Meist haben diese Methoden Namen wie "getValue()" oder dergleichen.
Ich bin da aber nicht so streng und greife also auch manchmal von außen direkt auf die Attribute zu.
Quote
[*]Zu 8.: definiere ich die Wattzahl mit 0 macht die Magie daraus auch 40 als hätte man nichts angegeben. Ist vielleicht nicht in jedem Fall erwünscht, denn der Parameter fehlt ja nicht. Ein Hinweis darauf wäre m. E. sinnvoll.

Oh, ja, das hatte ich gar nicht gesehen. Danke! Ich weiß auch gar nicht mehr, aus welchem Dokument ich diese Technik übernommen hatte.
Es war wieder dieses Prinzip, daß Python einen Mechanismus dafür (für solche Standardparameter) hatte (siehe oben in dem Skript), und ich mich darüber freute, das auch in Perl machen zu können.
Aber die 0 muß man abfangen, das ist richtig.
Quote
[*]Zur Vererbung: beeindruckende Möglichkeiten. Wenn man nun aber eine Methode versehentlich neu definiert kommt keine Warnung. Anders als das bei sub's der Fall ist. Kann man sich selbst dafür eine Sicherheit einbauen?

Das Neudefinieren von Methoden ist in der OOP eine gängige Technik. Man nennt das "Überladen". Deshalb gibt das wohl auch keine Warnung, weil es erwünscht ist. Ich weiß nicht, ob man einen Sicherheitsmechanismus einbauen könnte, ich mache das mit dem Überladen nicht so oft/gern. Man muß das wohl selber im Blick haben, denke ich.
Quote
[*]Ergänzungsvorschlag als Frage: gibt es immer nur ein $self oder kann man sich in komplexen Fällen auch mehrere definieren?

Also, ich kenne das immer nur mit einem $self.
Quote
[*]Wenn ich eine übergreifende Variable %env hereingeben will, ist das dann so korrekt (funktionieren tut es, was aber ja nicht immer best practice ist)?

Ja, man kann Methoden von außen Argumente übergeben.
%env scheint mir aber eine so allgemeine Variable zu sein, daß ich sie gleich bei "->new(\%env)" mitgeben und sie einem Attribut zuordnen würde, so daß %env dann in der ganzen Klasse bekannt ist.
2020-12-20T09:32:03 bianca
Auf jeden Fall werde ich deinen Text auf meinen "Spickzettel" setzen und die nächste größere sub wird stattdessen ein package. Ich hatte in Tutorial für Module u. a. schon mal einen Anlauf dazu genommen aber bin wieder ab gekommen.
Danke für deine Arbeit!

Vielen Dank für Dein Lob und Dein Feedback! Einen schönen vierten Advent wünsche ich!
Last edited: 2020-12-20 13:03:57 +0100 (CET)

View full thread Debugging Hilfe bei Can't use string ("1") as a subroutine ref while "strict refs" in use