コンテンツにスキップ

FREADYAML

Category: ファイル操作

書式

FREADYAML( path [, charset] )

引数

Parameter Description
path 読み込む YAML ファイルのパス(yaya.dll からの相対パス、または絶対パス)
charset ファイルの文字コード(省略可)。文字列("UTF-8" "Shift_JIS" など)または数値で指定する。省略時は UTF-8

戻り値

  • 成功時: YAML を変換した値(下記の 値の対応)
  • 失敗時: 空(VOID)

解説

YAML ファイルを丸ごと読み込んで解析し、ハッシュ・配列などの値にして返す。FOPEN で開いておく必要はない。

YAML の解析は YAYA が自前で行う。設定ファイルなどでよく使われる範囲(下記の 対応している書き方)に対応したもので、YAML の仕様をすべて満たしてはいない。

  • 先頭の UTF-8 の BOM は無視する。改行は CRLF / LF のどちらでもよい
  • 空のファイルや、コメントだけのファイルは空(VOID)になる。エラーにはならない

対応している書き方

書き方 例
ブロック形式のマッピング・シーケンス key: value、- item。key: の下に同じ桁で - item を並べる書き方も可
フロー形式 [1, 2]、{a: 1, b: 2}。入れ子や、複数行にわたる書き方も可
クォートなしの文字列 複数行にわたってもよい(改行は空白になり、空行は改行になる)
クォート付きの文字列 '...'('' で ')、"..."(\n \t \" \\ \x41 あ \U0001F600 などのエスケープ)
ブロックスカラー |(改行をそのまま残す)、>(改行を空白にする)。末尾の改行の扱い |- |+、字下げの指定 |2 も可
コメント # から行末まで(値の後に書くときは # の前に空白が必要)
アンカーとエイリアス &name を付けた値を *name で参照する(値を複製する)
マージキー <<: *name や <<: [*a, *b] でマッピングを取り込む。明示したキーと、先に書いたものが優先
文書の区切り 先頭の ---(と、その前の %YAML などのディレクティブ)、末尾の ...
タグ !!str(と !)は文字列にする。!!int !!float !!bool !!null はクォートされていても型を決める。ほかのタグは無視する

次のものには対応していない。書かれていると W0026 になる。

  • 1つのファイルに複数の文書(2つ目の ---)
  • 複合キー(? で始まるキー、キーにフロー形式を書いたもの)
  • 字下げにタブを使ったもの(値の中のタブは使える)

値の対応

型は YAML 1.2 の Core Schema の規則で決める。

YAML YAYA
マッピング ハッシュ。キーは常に文字列
シーケンス 汎用配列(要素に配列やハッシュを含む入れ子になる)
整数(123 -4 0o17 0x1F) 整数。10進で整数の範囲を超えるものは実数
実数(1.5 1e3 .5 .inf -.inf .nan) 実数
true / false(True TRUE なども) 整数 1 / 0
null / ~ / 値なし 空(VOID)
それ以外・クォート付き・ブロックスカラー 文字列
  • YAML 1.1 の処理系とは次の点が違う。yes no on off は文字列、017 は 10 進の 17、1_000 は文字列、2001-12-14 のような日付も文字列になる
  • マッピングのキーの並びは保たれない。ハッシュのキーの順になる(HASH_KEYS を参照)。1 のような正規形の整数のキーは h[1] でも h["1"] でも引ける
  • 同じキーが2回書かれていたら、後に書いたほうになる
  • 深い入れ子(256 段を超えるもの)と、エイリアスの複製が合計 100 万要素を超えるものはエラーにする(悪意のあるファイルでメモリを使い果たさないため)

エラー

状況 警告 GETLASTERROR
引数がない W0008 8
path が文字列でない W0009 9
charset が不正 W0012 / W0009 12 / 9
ファイルを開けない W0025 25
YAML として解析できない、対応していない書き方 W0026(行番号と原因も出力する) 26

使用例

config.yaml:

# ゴーストの設定
name: さくら
age: 17
height: 158.5
visible: true
memo: ~
tags: [ghost, shell]
talk:
  greeting: |
    こんにちは。
    今日もいい天気ですね。
  random:
    - おはよう
    - こんばんは
defaults: &defaults
  volume: 80
  speed: 2
voice:
  <<: *defaults
  speed: 3
_y = FREADYAML("config.yaml")
_y["name"]                   // さくら
_y["tags"][1]                // shell
_y["height"]                 // 実数の 158.5
_y["visible"]                // 1
_y["memo"]                   // 空(VOID)
_y["talk"]["greeting"]       // "こんにちは。" + 改行 + "今日もいい天気ですね。" + 改行
_y["talk"]["random"][0]      // おはよう
_y["voice"]["volume"]        // 80(defaults から取り込んだもの)
_y["voice"]["speed"]         // 3

互換性

  • YAYA: Tc602-5以降

関連項目