Nach dem Yaml 1.1 spec, 1:16
eine ganze Zahl in sexagesimal (Basis 60) Format.
Siehe auch http://yaml.org/type/int.html, die sagt:
Verwendung „:“ ermöglicht es ganze Zahlen in der Basis 60, die für die Zeit und Winkelwerte bequem ausdrücken.
Der Yaml Parser in Ruby enthalten, Psych, recognises this format and converts the value into an integer (zu Unrecht, shoud 1:16
71 sein - der Code Psych scheint zu asume, dass alle diese Werte in Form a:b:c
sein wird, aber die Regex erzwingt nicht das). Der Perl-Emitter (zumindest YAML :: XS, den ich getestet habe) erkennt dieses Format nicht, daher zitiert er die Zeichenkette nicht beim Schreiben der Datei. YAML :: XS tut erkennen und zitieren einige Ganzzahlen, aber nicht alle. YAML :: XS erkennt auch nicht viele andere Formate (z. B. Daten), die Psych tut.
(Es scheint, dass das sexagesimal Format has been removed from the Yaml 1.2 spec.)
Psych ziemlich viel Flexibilität in seiner Analyse ermöglicht - YAML.load_file
ist nur eine einfache Schnittstelle für die gemeinsamen Anwendungsfälle.
Sie könnten die parse
Methoden von Psych verwenden, um eine Baumdarstellung des yaml zu erstellen, und diese dann in eine Ruby-Datenstruktur mit einer benutzerdefinierten ScalarScanner
konvertieren (das Objekt, das Zeichenfolgen bestimmter Formate in den entsprechenden Ruby-Typ konvertiert). :
require('yaml')
class MyScalarScanner < Psych::ScalarScanner
def tokenize string
#this is the same regexp as Psych uses to detect base 60 ints:
return string if string =~ /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+$/
super
end
end
tree = YAML::parse_file 'test.yaml'
foo = Psych::Visitors::ToRuby.new(MyScalarScanner.new).accept tree
Dies ist im Grunde der gleiche Prozess, wenn Sie YAML.load_file
verwenden, außer dass es nutzt die angepasste Scanner Klasse auftritt. Eine ähnliche Alternative wäre, ScalarScanner
zu öffnen und die tokenize
Methode durch die angepasste zu ersetzen. Dies würde ermöglichen es Ihnen, die einfachere load_file
Schnittstelle zu verwenden, aber mit den üblichen Warnungen über Klassen Affe Patchen:
class Psych::ScalarScanner
alias :orig_tokenize :tokenize
def tokenize string
return string if string =~ /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+$/
orig_tokenize string
end
end
foo = YAML.load_file 'test.yaml'
Beachten Sie, dass diese Beispiele berücksichtigen ausschließlich die Werte mit einem Format wie 1:16
. Je nachdem, was Ihr Perl-Programm ausgibt, müssen Sie möglicherweise auch andere Muster überschreiben. Eine besonders, die Sie vielleicht betrachten möchten, ist Sexagesimal Floats (z. B. 1:16.44
).
Können Sie einige Beispiel-YAML-Daten zusammen mit dem Ruby- und Perl-Code, den Sie zum Entschlüsseln verwenden, angeben? – Schwern
4560 ist die Anzahl der Sekunden in einer Stunde und 16 Minuten (unter der Annahme, keine Schaltsekunden). – ikegami
Wie sieht die generierte YAML-Datei aus? – bta