In Perl wird der Punkt-Operator (.) zur expliziten Verkettung von Strings verwendet. Historisch gesehen ist diese Art der Verbindung in Perl bequemer als in vielen anderen Sprachen und wird häufig zum Zusammenfügen von Strings oder dynamischen Nachrichten verwendet. Die Verkettung wird als String-Operation behandelt, was häufig zu subtilen Fehlern führen kann.
Hintergrund:
Bereits in den frühen Zeiten bot Perl einen expliziten Operator zum Verketten von Strings an, um ihn von der Addition von Zahlen zu unterscheiden — denn + ist in Perl immer numerisch.
Problem:
Das Hauptproblem ist die implizite Typumwandlung. Perl konvertiert Werte automatisch in Strings, wenn in einem Ausdruck ein Punkt (.) verwendet wird, aber dies kann zu unerwarteten Ergebnissen führen, wenn mit Zahlen, undef oder komplexen Strukturen gearbeitet wird.
Lösung:
Verwenden Sie den Punkt nur zur Verkettung von Strings und seien Sie vorsichtig beim Mischen von Typen. Versuchen Sie, Daten explizit in einen String umzuwandeln, wenn Sie sich über den Typ nicht sicher sind.
Beispielcode:
my $a = 20; my $b = ' Äpfel'; my $c = $a . $b; # $c wird '20 Äpfel' my $d = undef; my $s = 'Antwort: ' . $d; # $s — 'Antwort: '
Wichtige Besonderheiten:
+ addiert immer Zahlen.Was passiert bei der Verkettung von undef und einem String?
Perl wandelt undef ohne Warnung in einen leeren String um. Dies kann zu Ausgabefehlern führen, wenn eine bedeutungsvolle Information erwartet wurde.
Was unterscheidet die Operatoren ".=" und "=" beim Arbeiten mit Strings?
.= ist der Zuweisungsoperator mit Verkettung (erhöht den String), = ist eine einfache Zuweisung. Der Unterschied ist entscheidend bei iterativen Operationen und bei der Arbeit mit großen Datenmengen.
my $str = "a"; $str .= "b"; # str = "ab" $str .= "c"; # str = "abc"
Kann der Punkt (.) versehentlich als Teil einer Zahl (zum Beispiel in einer Dezimalzahl) interpretiert werden?
Nein, innerhalb eines Ausdrucks unterscheidet Perl immer zwischen . als Verkettung und . als Teil einer Zahl. In regulären Ausdrücken hat der Punkt jedoch eine andere Bedeutung ("jedes Zeichen").
+ und . in einem Ausdruck ohne explizite Typkontrolle.Wir verketten Zahlen und Strings ohne explizite Typkontrolle, erwarten "3 Äpfel", aber erhalten "12 Äpfel".
Vorteile:
Nachteile:
Wir wandeln alle Zahlen vorher in Strings um und verwenden nur den Punkt für String-Operationen.
Vorteile:
Nachteile: