YAML

YAML のハマりどころ

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"

yesno あたりは,実装によってブール値扱いされるかもしれないしされないかもしれないグレーゾーンです.
下記のページに,グレーゾーンなブール値リテラルがたくさん載ってます.

コロンのつけ忘れ

あまり大した話ではないですが,コロンを付け忘れても構文エラーにならず,見た目上も気づきにくいようなケースがあります.

例えば,次のようなデータを書こうとしてコロンを付け忘れたとします.

---
- 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"

参考リンク