eine weitere Alternative zu installieren, wenn Sie Ihre Anfälligkeit für #eval
minimieren wollte (was eine rationale Sache zu tun) zu verwenden ist String#scan
:
quoted = /"(?:\\.|[^\\"])*"/
pairs = '{"city": "London", "country": "England", "region": "Europe"}'.scan(/(#{quoted})\s*:\s*(#{quoted})/)
hash = Hash[ *pairs.flatten.map { |q| eval q } ]
Wir verwenden immernoch #eval
, aber wir wissen, dass wir nur #eval
sind, die etwas wie eine Zeichenfolge in Anführungszeichen aussieht, also sind wir sicher. Da Rubin Strings beliebigen Code (durch das Wunder der Interpolation) enthalten kann, sind wir immer noch verwundbar, aber:
# arbitrary code evaluation
p eval('"one two #{puts %{Give me a three!}; gets.chomp} four"')
Die sicherste Alternative ist #eval
ganz zu umgehen, und eine Bibliothek verwendet für Streicher unquoting, die ‚doesn t erlauben Interpolation. Die JSON-Bibliothek (wie bereits erwähnt) ist ein großartiges Beispiel dafür. Es scheint langsamer (da es ist nicht so optimiert wie #eval
ist), aber es ist eine ganze Menge viel sicherer.
Was Sie versuchen zu erreichen, ist nicht klar. Sind die Daten in einer Datei? Offensichtlich kann die obige Zeile nicht schon Ruby sein –
Es ist nicht; es sieht aus wie Python, oder vielleicht eine Python-artige selbstgebraute Syntax. Das OP möchte es in Ruby-Code umwandeln. – mipadi
Ich bin auch ein bisschen verwirrt ... Wenn es in einer Textdatei ist, würden Sie offensichtlich ein Suchen und Ersetzen von: zu => ... aber das wäre zu einfach. Können Sie bitte weiter erklären, was Sie meinen? – micmoo