ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [CODESCHNIPPSEL] Suchen und Ersetzen
BeitragVerfasst: 20 Sep 2004, 22:35 
Offline
Schüler

Registriert: 11 Mai 2004, 07:10
Beiträge: 48
Wohnort: Stmk - Österreich
morgen,

hatte kürzlich das problem, aus einem text alle wörter die von % zeichen umschlossen sind durch etwas anderes zu ersetzen. der zu ersetzende text war in einer HashMap gespeichert, wobei der text zwischen den % der key für die HashMap ist.

beispiel



1
2
text = "Hallo %Name1%, ich bin %Name2%
hashmap = {"Name1" => "Maxl", "Name2" => "Hubert"}


als ergebnis soll hier rauskommen



1
2

Hallo Maxl, ich bin Hubert


hab dazu folgendes kurzes programm geschrieben



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

def getKeys(text)
_x = text
ret = []
while _x =~ /%(\w+)%/ # pr��fen ob es noch w��rter zwischen zwei % gibt
_x = $' # hinter dem gefunden ausdruck weitersuchen
ret.push($1) # gefundenes wort merken
end
ret
end

def replace(text, repl)
ret = text
getKeys(text).each do |elem| # alle keys durchlaufen
ret.gsub!("%"+elem+"%", repl[elem]) if repl[elem] != nil # wenn gefundener key in HashMap, den text durch dessen wert ersetzen
end
ret
end

puts replace("hallo %Name1%, ich bin %Name2%", {"Name1" => "Maxl", "Name2" => "Hubert"})


vielleicht kann sonst noch jemand sowas gebrauchen. eventuell sieht hier jemand noch optimierungspotential.

lg,
Kogs

ps: das war der erste fall, dass ich eine schleife (while) in ruby gebraucht hab


Nach oben
 Profil  
 
BeitragVerfasst: 20 Sep 2004, 23:19 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
Kogs hat geschrieben:
eventuell sieht hier jemand noch optimierungspotential.



1
2
3
def replace2 s, rp
s.gsub(/%(\w+)%/) { rp[$1] || '%' + $1 + '%' }
end


sofort vereinfachen in deinem code könnte man:

1
2
3
... if repl[elem] != nil
# ist dasselbe wie
if repl[elem]


und, schön objektorientiert:

1
2
3
4
5
6
7
class String
def gsub_hash hsh
gsub(/%(\w+)%/) { hsh[$1] || $& }
end
end

puts "hallo %Name1%, ich bin %Name2% %test%".gsub_hash({"Name1" => "Maxl", "Name2" => "Hubert"})

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 21 Sep 2004, 08:12 
Offline
Schüler

Registriert: 11 Mai 2004, 07:10
Beiträge: 48
Wohnort: Stmk - Österreich
morgen,

wow, bin begeistert. hab lange drüber nachgegrübelt ob man das als einzeiler lösen kann, bin dann aber doch nur auf meine lange lösung gekommen.

was ich bei deiner lösung noch nicht rausgefunden hab, ist die bedeutung der beiden ||.



1
2
3
4
gsub(/%(\w+)%/) { hsh[$1] || $& }

Doku zu gsub
str.gsub( pattern ) {| match | block }


dachte mir zuerst, dass das ein leerer match der gsub methode ist, doch dann versteh ich den teil vor den || nicht. vor dem |match| darf ja nix stehen, oder?


lg,
Kogs


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 21 Sep 2004, 10:08 
Offline
Obfuscator

Registriert: 20 Jul 2003, 22:14
Beiträge: 597
Hmm, mir wäre als erstes




hashmap.each_key {|tag| text.gsub!("%"+tag+"%", hashmap[tag])}


eingefallen. Bin nicht so fit in Regularen Expressions. Aber murphy sollte auf jeden Fall schneller sein. Der Text wird ja dann nur einmal durch laufen. Das muss gleich mal im RubyBB ändern, da gibt`s nämlich ein ähnlichen Fall.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 21 Sep 2004, 11:30 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
Kogs hat geschrieben:
was ich bei deiner lösung noch nicht rausgefunden hab, ist die bedeutung der beiden ||.
oh. ich dachte, das kennst du.

|| heißt oder. a || b ist die abkürzung für


if a then a else b end
, das heißt, der ausdruck (a || b) liefert
- a, wenn a nicht nil oder false ist
- b sonst

das hat mit den strichen um die lokalen parameter nichts zu tun.
ich habe |match| einfach weggelassen.

mir ist gerade aufgefallen, dass man offenbar auch einfach or statt || schreiben kann. benutz lieber das, ist lesbarer.

@bunny: ich glaube auch, dass deins langsamer ist. denk auch dran, waqs passieren würde, falls du %a% durch %b% und %b% durch %c% ersetzen willst: das ergebnis wird völlig unvorhersehbar.

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 21 Sep 2004, 12:17 
Offline
Schüler

Registriert: 11 Mai 2004, 07:10
Beiträge: 48
Wohnort: Stmk - Österreich
murphy hat geschrieben:
|| heißt oder


danke, wieder was dazugelernt, ist mir bis jetzt noch nicht untergekommen.

jetzt versteh ich auch deinen lösungsweg.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron