YAMLについてメモ

■ 【改行】
普通の改行

● 0x0d(LF)
● 0x0a(CR)
● 0x85(unicode next line(NEL))

特別な意味のある改行

● 0x2028(unicode line separator(LS))
● 0x2029(unicode paragraph separator(PS))

■ 【配列】
行頭に「-」をつけることで配列を表現します。「-」のあとには半角スペースを入れます
半角スペースでインデントすると、配列をネストさせることができます

- arrayValue01
-
  - arrayValue02
  - arrayValue03
- arrayValue04

⇒ array( 'arrayValue01', array( 'arrayValue02', 'arrayValue03' ), 'arrayValue04' )

■ 【ハッシュ】
『key:value』形式で表します。『:』のあとに半角スペースを1つ以上入れます
半角スペースでインデントすると、ハッシュをネストさせることができます

KEY01: arrayValue01
KEY02:
  KEY21: arrayValue02
  KEY22: arrayValue03
KEY03: arrayValue04

⇒ array( 'KEY01' => 'arrayValue01', 'KEY02' => array( 'KEY21' => 'arrayValue02', 'KEY22' => 'arrayValue03' ), 'KE03' => 'arrayValue04' )

■ 【配列とハッシュのネスト】
配列とハッシュはお互いにネスト可能

names:
  - Hanako
  - Sumire
  - Momoko
emails:
  - hanako@mail.com
  - sumire@mail.net
  - momoko@mail.org

⇒ array( 'names' => array( 'Hanako', 'Sumire', 'Momoko' ), 'emails' => array( 'hanako@mail.com', 'sumire@mail.net', 'momoko@mail.org' ) )

■ 【ブロックとフロー】
インデントを使って構造を表す書き方を『ブロックスタイル』という
これに対して『{}』や『[]』を使って構造を表す記述方法を『フロースタイル』という

配列     ⇒ [ arrayValue01,        arrayValue02,        arrayValue03 ]
ハッシュ ⇒ { KEY01: arrayValue01, KEY02: arrayValue02, KEY03: arrayValue03 }

■ 【スカラーとデータ型】
配列やハッシュのような、他のデータを要素としてもつデータは『コレクション (Collection)』という
それ以外のデータ (数値や文字列など) は『スカラー (Scalar)』という

以下のデータ型は自動的に判別されます
これら以外は文字列として認識されます。また引用符『’』や二重引用符『”』で囲むと、強制的に文字列として認識される
● 整数
浮動小数
● 真偽値 (true, yes, false, no)
● Null値 (null, ~)
● 日付 (yyyy-mm-dd)
● タイムスタンプ (yyyy-mm-dd hh:mm:ss [+-]hh:mm)

decimal1:  123                           # 整数 (10 進数)
decimal2:  1,234,567,890                 # 整数 (10 進数)
octal:     0644                          # 整数 (8 進数)
hexa:      0xFF                          # 整数 (16 進数)
float1:    0.05                          # 浮動小数点
bool1:     true                          # 真
bool2:     yes                           # 真
bool3:     on                            # 真
bool4:     false                         # 偽
bool5:     no                            # 偽
bool6:     off                           # 偽
null1:     ~                             # Null 値
null2:     null                          # Null 値
date:      2005-01-01                    # 日付
stamp:     2005-01-01 00:00:00 +09:00    # タイムスタンプ
str1:      'true'                        # 文字列
str2:      "2005"                        # 文字列
symbol:    :foo                          # シンボル (Syck の独自機能)

■ 【ヘッダとフッタ】
『---』でデータ構造を区切る事で1つのファイルに複数のYAMLドキュメントを含めることができます
『...』でデータ構造を区切る事とそれ以降は読込まれません。『__END__』のようなものです。

---
name: foo
email: foo@mail.com
---
name: bar
email: bar@mail.org
...
name: baz
email: baz@mail.net

■ 【YAMLストリームとドキュメントの例】

# ここから始まるバイト列は、UTF-8で記述されたYAMLストリームだ。
# このストリームは、四つのドキュメントからなる。
# このストリームの初めのドキュメントは、ヘッダ行が省略してある。
# 中身はブロックマッピング。

今日の晩御飯:
  - 桜肉の大和煮(缶詰)
  - ロシアブレッド(100円の30パーセント引き)
  - ぼたもち(あんこときなこ)

昨日の晩御飯:
  - ふじりんご二個

# 次はヘッダ行で始まる新たなドキュメント
# 中身はブロックシーケンス

---
- 渡辺
- 大丸
- 岩田(三越)
- 松屋

# 例えばこれが何かのプログラムが不定期に吐き出すログかなんかだとして、
# 次のドキュメントが来るまで3時間かかるとすると、
# 上のドキュメントが処理されるのも3時間後になる。
# しかし、ここで

...

# を入れてあげると、ドキュメントの終わりを認識して処理を始めるから
# 三時間待たなくても済む。

# 三時間経過
# 次はフローマッピング

---
{date: 2003-11-19, note: "今日は眠かった。" }

# 最後はスカラ

--- |
  毎回例を考えるのはとてもめんどくさい
  仕様書の例は適切でシンプルで分りやすいが、
  なかなかそうはいかない

【参考】
YAML home http://yaml.org/