Thread Split-delimiters -> " " und "" und // und / / (19 answers)
Opened by Student87 at 2012-11-21 15:10

Student87
 2012-11-21 15:10
#163479 #163479
User since
2012-11-08
73 Artikel
BenutzerIn
[default_avatar]
Hi,
die folgenden Fragen beziehen sich auf Perl 8.8. Ist zwar ne alte Version, aber um Documentary-Description-Logik zu verstehen reichts.

Hier der Link zum Documentary-Artikel, auf den ich mich beziehe:
http://perldoc.perl.org/5.8.8/functions/split.html

-------------------------------------------------------------

Erster Fall: " "


In dem Artikel steht:

"As a special case, specifying a PATTERN of space (' ' ) will split on white space just as split with no arguments does."

Okay, splittet also on whitespace. Dazu ein kleiner oneliner-Test:

Code (perl): (dl )
perl -e '$blub="a b   c"; @blub=split(/" "/,$blub); foreach(@blub) {$c++; print "$c $_\n"}'


Zwischen a und b befindet sich 1 Leerzeichen und zwischen b und c befinden sich 3 Leerzeichen.

Zur Erklärung: $c benutze ich nur, um im Terminal-Output quasi Liniennummern zu haben. Damit man mehrere leere Linien untereinander gut erkennt.

So, also laut Doku wird jetzt bei whitespace gesplittet. Meine 4 Leerzeichen sind ja whitespaces. Also erwarte ich erstmal nen Split zwischen a und b. Denn zwischen den beiden gibts ein Leerzeichen (= whitespace). Das heisst, der Array, in dem ich das split-Ergebnis speichere hat schonmal MINDESTENS 2 Elemente. Und da ich ja jedes Array-Element als eigene line ausgebe, erwarte ich schonmal mindestens 2 Linien. Jetzt befindet sich zwischen b und c DREIMAL das Leerzeichen. 3 Leerzeichen = 1 whitespace, richtig? Ein Whitespace kann auch aus aneinander gereihten TABs bestehen, wenn ich das richtig verstanden habe. Einfach alles, was auf dem Papier weissen Abstand erzeugen würde.

Somit würde ich im Output erwarten:

1 a
2 b
3 c

Stattdessen bekomme ich:

1 a b c

Warum ... ?


-------------------------------------------------------------

Zweiter Fall: ""

Das wäre der empty string, welcher in der Doku nicht erwähnt wird ... !?!?

-------------------------------------------------------------

Dritter Fall: //

Der empty pattern.

Dazu steht geschrieben

"As a special case for split, using the empty pattern // specifically matches only the null string"

und

"A pattern matching the null string [...] will split the value of EXPR into separate characters at each point it matches that way."

Dieser Fall ist klar und es passiert das, was ich von der Doku her erwarte:

Code (perl): (dl )
perl -e '$blub="a b   c"; @blub=split(//,$blub); foreach(@blub) {$c++; print "$c $_\n"}'


wird zu

1 a
2
3 b
4
5
6
7 c

-------------------------------------------------------------

Vierter Fall: / /

Dazu steht folgender Satz geschrieben:

"As a special case, specifying a PATTERN of space (' ' ) will split on white space just as split with no arguments does. Thus, split(' ') can be used to emulate awk's default behavior, whereas split(/ /) will give you as many null initial fields as there are leading spaces."

Folgendes Beispiel, zu splittender String: " a b".
Wenn ich jetzt mit " " splitte, dann ist der erste split vor dem a. Das heisst, ich bekämne 1 x empty string, 1 x a und 1 x b. Richtig?

Und ich glaube, dass / / einen vor diesem empty string bewahren will, indem es die leading spaces in null fields verwandelt.

Jetzt bekomme ich aber für

Code (perl): (dl )
perl -e '$blub="a b   c"; @blub=split(/ /,$blub); foreach(@blub) {$c++; print "$c $_\n"}'


als Ergebnis

1 a
2 b
3
4
5 c

Und das ist mir ein absolutes Rätsel ... ?
Last edited: 2012-11-21 15:43:56 +0100 (CET)

View full thread Split-delimiters -> " " und "" und // und / /