Leere Strings am Anfang und Ende der Teilung [duplizieren]

8

Wenn ich in Ruby eine Zeichenfolge mit einem Begrenzer aufspalte, der mit dem Anfang der Zeichenfolge übereinstimmt, wird an der ursprünglichen Position des Arrays eine leere Zeichenfolge zurückgegeben:

%Vor%

Aber wenn ich eine ähnliche Sache mit einem Trennzeichen mache, das dem Ende der Zeichenkette entspricht, gibt es keine leere Zeichenkette:

%Vor%

Das sieht für mich widersprüchlich aus. Gibt es Gründe für eine solche Spezifikation?

Bearbeiten Wenn es mit der Spezifikation von Perl kompatibel sein soll, wie in der Antwort von short, bleibt die Frage gleich: Warum ist es in Perl so? Aus diesem Grund wird es jetzt auch eine Frage über Perl.

    
sawa 07.11.2012, 15:55
quelle

2 Antworten

4

Nach dem Lesen der AWK-Spezifikation, nachdem mu zu kurz ist, kam ich zu dem Gefühl, dass die ursprüngliche Absicht für split in AWK darin bestand, Teilstrings zu extrahieren, die Feldern entsprechen, die jeweils mit einem Interpunktionszeichen wie , abgeschlossen sind. . , und das Trennzeichen wurde als ein "Ende des Felds" angesehen. Die Absicht bestand nicht darin, eine Saite symmetrisch in die linke und die rechte Seite jeder Trennposition zu teilen, sondern eine Teilkette auf der linken Seite einer Trennposition zu beenden. Unter diesem Konzept ist es sinnvoll, immer eine Zeichenkette (auch wenn sie leer ist) auf der linken Seite des Trennzeichens zu haben, aber nicht unbedingt auf der rechten Seite des Trennzeichens. Dies könnte Ruby über Perl geerbt haben.

    
sawa 07.11.2012, 20:13
quelle
9

Aus dem Handbuch :

  

split (Muster = $ ;, [limit]) → einArray
  [...]
  Wenn der Parameter limit nicht angegeben wird, werden abschließende Nullfelder unterdrückt. Wenn limit eine positive Zahl ist, wird höchstens die Anzahl der Felder zurückgegeben (wenn limit 1 ist, wird die gesamte Zeichenfolge als einziger Eintrag in einem Array zurückgegeben). Wenn dies negativ ist, gibt es keine Begrenzung für die Anzahl der zurückgegebenen Felder, und abschließende Nullfelder werden nicht unterdrückt.

So werden abschließende "Nullfelder" unterdrückt, weil die Dokumentation sagt, dass sie sind. Wenn Sie den nachgestellten leeren String wünschen, fragen Sie danach:

%Vor%

Warum würde es sich so verhalten? Wahrscheinlich, weil es Perls split Verhalten entspricht:

  

Wenn LIMIT negativ ist, wird es so behandelt, als wäre es stattdessen beliebig groß; so viele Felder wie möglich werden produziert.

und wir sehen, dass die Verwendung eines negativen limit wiederum die folgende leere Zeichenfolge liefert:

%Vor%

Warum sollte Perls Verhalten kopiert werden? Frag Matz.

    
mu is too short 07.11.2012 16:37
quelle

Tags und Links