[ruby-de] String-Bearbeitung, gsub

Wolfgang Nádasi-Donner ruby at wonado.de
Mi Aug 30 21:32:19 JST 2017


Am 30.08.2017 um 12:29 schrieb Norbert Melzer:
> Wolfgang Nádasi-Donner <ruby at wonado.de> schrieb am Mi., 30. Aug. 2017 um
> 12:08 Uhr:
> 
>> Am 30.08.2017 um 02:04 schrieb Die Optimisten:
>>> Hallo
>>>
>>> "ab/cd".gsub( /\/(.)/,  "\\1".upcase)        # => "Abcd"
>>> # auf das wesentliche komprimiert
>>> Warum wird das .upcase nicht ausgeführt?, wie tut man das (gehts auch
>>> ohne Block)?
>>>
>>> danke
>>> Andreas
>>>
>>>
>>
>> btw: Du meintest wohl "abCd" als erwartetes Ergebnis
>>
> 
> Wo siehst du ein erwartetes Ergebnis? Ich sehe per Konvention lediglich
> einen Marker für „das hab ich bekommen“ und das stimmt nicht einma, denn er
> bekommt lediglich `"abcd"` zurück.
Ich verstehe Deine Antwort nicht. Die "gsub"-Methode auf den String
"ab/cd" angewandt zieht auf dem Pattern "\/(.)" und liefert als erste
(und einzige Gruppe) das "c". Das lässt sich in "irb" leicht nachprüfen...


irb(main):001:0> "ab/cd".match(/\/(.)/)
=> #<MatchData "/c" 1:"c">


Ich hätte also erwartet, dass "gsub" mit zwei Parametern ausgeführt die
Referenz auf die erkannte Gruppe einsetzt, dass also in dem Fall aus
"\\1" oder '\1' das "c" in den als zweiten Parameter angegebenen String
eingesetzt wird, bevor der zur weiteren Verarbeitung (in diesem Fall
durch "upcase") breitgestellt wird. Das scheint aber, wie die Ausgabe...

irb(main):002:0> "ab/cd".gsub( /\/(.)/,  '\1otto\1'.upcase)
=> "abcOTTOcd"

...zeigt, nicht der Fall zu sein.

Ich habe noch einmal in der 1.9&2.0-er Pickaxe gesucht, aber keine
Erklärung für diesen Effekt gefunden.

Ich finde den schon bemerkenswert, denn ich dachte bisher, dass das so
funktioniert, wie ich es erwartet hätte.

Ich werde mich allerdings auch nicht weiter um die Sache kümmern, weil
ich aktuell mit Haskell arbeite und Ruby ziemlich weit hinten in meine
Prioritätsschublade gepackt ist. Eine Anmerkung bezüglich dieses
unerwarteten Effekts habe ich aber in die PickAxe geschrieben.

Viele Grüsse, WoNáDo


Mehr Informationen über die Mailingliste ruby-de