Ansible とかで YAML 書いててハマったところ.
YAML にはデータ型がある
何をいまさらといった話ですが,YAML のスカラ型には文字列型以外に数値型や論理型もあるということを意識していないと,気を抜いた瞬間にハマります.
---
id: 0010
name: sato
ここで id
を文字列 "0010" の意図で書いたつもりでも,実際には 8 進数の 10 とみなされます.
つまり,次のようにみなされます.
---
id: 8
name: sato
ブール値リテラルはたくさんある
データ型の話の続きになりますが,今度はブール型の話です.YAML のブール値リテラルはいろいろ種類があるので注意です.
---
no: 3
name: kato
こんなふうに不用意に no
と書いてしまうと,実装によってはその部分が false
とみなされてしまいます.
---
"false": 3
"name": "kato"
yes
,no
あたりは,実装によってブール値扱いされるかもしれないしされないかもしれないグレーゾーンです.
下記のページに,グレーゾーンなブール値リテラルがたくさん載ってます.
コロンのつけ忘れ
あまり大した話ではないですが,コロンを付け忘れても構文エラーにならず,見た目上も気づきにくいようなケースがあります.
例えば,次のようなデータを書こうとしてコロンを付け忘れたとします.
---
- tasks:
- foo
- bar
- baz
つまり,次のように書いてしまったとします.
---
- tasks
- foo
- bar
- baz
インデントも正しくそれっぽく書けているので,構文のハイライト機能がない環境だと間違いに気づきにくかったり.
しかも構文エラーになることもなく,次に示すものと等価の妥当なデータとみなされるのが厄介なところです.
---
- "tasks - foo - bar - baz"
ブロックスタイル文字列の改行
YAML の文法を熟知していれば済む話ですが,文字列をブロックスタイルで書くときは,改行の扱いをどうするかによって,使用するブロックスタイルの種類の吟味が必要です.
---
- msg: |
lorem
ipsum
- msg: |+
lorem
ipsum
- msg: |-
lorem
ipsum
- msg: >
lorem
ipsum
- msg: >+
lorem
ipsum
- msg: >-
lorem
ipsum
こう書くと,次のように改行文字が入ります.
---
- msg: "lorem\nipsum\n"
- msg: "lorem\nipsum\n\n"
- msg: "lorem\nipsum"
- msg: "lorem ipsum\n"
- msg: "lorem ipsum\n\n"
- msg: "lorem ipsum"