Ich bin mir nicht sicher, ob dies ein definiertes Verhalten ist oder nicht. Ich habe den folgenden Code:
%Vor% Neben einer Warnung über substr()
nach dem Ende einer Zeichenfolge, bin ich verwirrt über die Ausgabe:
Perldoc sagt über substr
:
substr EXPR, OFFSET, LÄNGE
Wenn OFFSET und LENGTH einen Teilstring angeben, der teilweise außerhalb des Strings liegt, wird nur der Teil innerhalb des Strings zurückgegeben. Wenn der Teilstring über beide Enden des Strings hinausgeht, gibt substr () den nicht definierten Wert zurück und erzeugt eine Warnung.
Sowohl length($string)
als auch length($string) + 1
liegen außerhalb des (nullindizierten) Endes der Zeichenkette, daher weiß ich nicht, warum substr
die leere Zeichenkette in einem Fall und undef
im anderen Fall zurückgibt. Hat es mit dem NULL-Zeichen zu tun, das C für die Zeichenfolgebeendigung verwendet und das im ersten Fall irgendwie von substr
zurückgegeben wird, so dass es ein "unsichtbares" letztes Zeichen für diese Zeichenfolge gibt, das nicht von length
gezählt wird. ? Fehle ich etwas Offensichtliches hier?
Dies gab Ihnen eine leere Zeichenkette, weil substr
die offset
zwischen 0 to len(str)
berücksichtigt und alles, was über diesen Bereich hinausgeht, ist undef
.
Also, substr("aa", 2, 1);
- & gt; gibt dir die leere Zeichenfolge nach dem letzten a
und, substr("aa", 3, 1);
- & gt; Gibt dir undef
(Substring vollständig außerhalb des Bereichs)
Ähnlich: -
substr("aa", 2, 2);
- & gt; Wird dir die leere Saite nach dem letzten geben
a
(Teilstring teilweise außerhalb des Bereichs) Nun zum zweiten: -
%Vor% Dies ist bereits der letzte erlaubte offset
. Also gibt es undef
value zurück.
Angenommen: -
%Vor%Dann wird der Index wie folgt aussehen: -
%Vor%AKTUALISIEREN :
Also, wie @Borodin in seinem Beitrag erklärt, kommt das Zeichen d
zwischen den Offsets - 3
und len(str)
im obigen Beispiel.
Wenn wir jedoch versuchen, auf etwas jenseits von len(str)
einschließlich len(str)
zuzugreifen, erhalten wir eine empty
-Zeichenfolge, wie in der Dokumentation , die besagt, dass -
Wenn OFFSET und LENGTH eine Teilzeichenkette angeben, die teilweise außerhalb der string, nur der Teil in der Zeichenkette wird zurückgegeben.
Auch Wenn wir versuchen, auf etwas jenseits von len(str)
mit Ausnahme von len(str)
zuzugreifen, erhalten wir undef
value, wie in docs : -
Wenn der Teilstring über beide Enden des Strings hinausgeht, wird substr () zurückgegeben der undefinierte Wert und erzeugt eine Warnung.
Hier gibt es ein paar Probleme. Zuerst sollten Sie den substr
Offset berücksichtigen, um die Position zwischen Zeichen anzugeben:
Sie können also sehen, dass Offset 6 - die Länge der Zeichenfolge - am Ende der Zeichenfolge ist, nicht darüber hinaus.
Zweitens dient der Parameter length von substr
als Obergrenze für die Anzahl der zurückgegebenen Zeichen, keine Voraussetzung. Das bedeutet, dass die Dokumentation bedeutet, dass nur der Teil innerhalb der Zeichenkette zurückgegeben wird .
Wenn man diese zusammenfügt, gibt ein Aufruf wie substr 'STRING', 6, 1
- nach einem Maximum eines Zeichens am Ende der Zeichenkette an - gibt die leere Zeichenkette zurück, während man nachfragt alles jenseits Das Ende der Zeichenfolge (oder vor dem Start) gibt undef
.