Warum gibt substr am Ende einer Zeichenkette nicht undef zurück?

8

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:

%Vor%

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?

    
mpe 26.10.2012, 11:27
quelle

2 Antworten

5
%Vor%

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.

    
Rohit Jain 26.10.2012, 11:52
quelle
7

Hier gibt es ein paar Probleme. Zuerst sollten Sie den substr Offset berücksichtigen, um die Position zwischen Zeichen anzugeben:

%Vor%

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 .

    
Borodin 26.10.2012 12:47
quelle

Tags und Links