Yaml 1.1 仕様によると、1:16
60 進数 (base 60) 形式の整数です。
http://yaml.org/type/int.htmlも参照してください。
「:」を使用すると、基数 60 で整数を表現できます。これは、時間と角度の値に便利です。
Ruby に含まれる Yaml パーサーである Psych は、この形式を認識し、値を整数に変換します(間違って、1:16
71 にする必要があります。Psych コードは、そのような値がすべてこの形式になると想定しているようですa:b:c
が、正規表現はそれを強制しません)。 . Perl エミッター (少なくとも私がテストした YAML::XS) はこの形式を認識しないため、ファイルを書き込むときに文字列を引用しません。YAML::XSはいくつかの整数を認識して引用しますが、すべてではありません。YAML::XS は、Psych が認識できる他の多くの形式 (日付など) も認識しません。
(60 進数形式は Yaml 1.2 仕様から削除されたようです。)
Psych は、その解析においてかなりの柔軟性を可能にしますYAML.load_file
。これは、一般的な使用例のためのシンプルなインターフェースです。
Psychのメソッドを使用しparse
て yaml のツリー表現を作成し、カスタムScalarScanner
(特定の形式の文字列を適切な Ruby 型に変換するオブジェクト) を使用してこれを Ruby データ構造に変換できます。
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
YAML.load_file
これは、カスタマイズされたスキャナ クラスを使用する点を除いて、基本的に を使用する場合と同じプロセスです。
同様の代替手段は、メソッドを開いてカスタマイズしScalarScanner
たメソッドに置き換えることです。tokenize
これにより、よりシンプルなインターフェースを使用できるようになりますが、load_file
モンキー パッチ クラスに関する通常の注意事項があります。
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'
これらの例では、 のような形式の値のみが考慮されることに注意してください1:16
。Perl プログラムが発行するものによっては、他のパターンもオーバーライドする必要がある場合があります。特に注目したいのは、60 進浮動小数点数 (例: 1:16.44
) です。