5分鐘認識YAML

5分鐘認識YAML

翻譯: liubin                http://www.ruby-cn.org/
原文: http://yaml.kwiki.org/index.cgi?HomePage

文檔位置:http://www.ruby-cn.org/articles/yaml_in_5_minutes.html

2004/11/11

譯者注:在開始之前,也許,你想先看看yaml的基本概念,如果是,請點這裏:http://www.ruby-cn.org/articles/what_is_yaml.html


第一分鐘:一個簡單的列表

你的朋友給你寄了一封如下的信件:

- Memoirs Found in a Bathtub
- Snow Crash
- Ghost World

同時,他也要求你按照上面的順序來閱讀這些書,他想和你探討關於這些書的內容。

在YAML中,這些有順序的列表(list)叫做序列sequence)。序列包括了一組有順序的數據,當你在程序中載入這個序列,它們的順序保持不變。

在很多比較靈活的語言中,你可以用指定索引的方式訪問這個序列及其中的值。以0開頭的表示這個序列的第一項。

在PHP, Perl, 或 Ruby中,可以這樣:

print $book_list[0];

打印結果如下:

Memoirs Found in a Bathtub

這也是上面書籍列表的第一項。


其他列表

列表(Lists)可以包括各種數據:

---
- 1           # Numbers
- Snow Crash  # Strings
- 2003-07-24  # Dates

上面的列表以三個"-"開頭,這三個"-"是文檔分割符document separator),它表示了一段YAML文檔的開始。當然,你也可以劃分多個文檔,比如:

---
- Harry Potter and the Prisoner of Azkaban
- Harry Potter and the Goblet of Fire
- Harry Potter and the Order of the Phoenix
---
- Memoirs Found in a Bathtub
- Snow Crash
- Ghost World

第二分鐘:一個簡單的字典

當你沉浸在閱讀 Harry Potter 時,你的朋友又寄來了新的列表,這次列表包括了作者的名字:

Stanislaw Lem: Memoirs Found in a Bathtub
Neal Stephenson: Snowcrash
Daniel Clowes: Ghost World

上面的字典沒有順序,但是每個作者都對應一本書的名字。你的朋友希望你可以根據作者找到你想要的書。(注意前面沒有"-")

在YAML中,這樣的字典結構稱爲 map,map通常用來存放成對的數據,冒號左面的稱爲key,右面的叫做value。 

key 用作從map中取數據的索引。

在PHP 或 Ruby中,可以這樣寫:

print $books_by_author['Daniel Clowes'];

將打印如下內容:

Ghost World

Sequence中的Map

你的朋友寄給你了一份更新的列表,包括了作者,書名,並且有一定的順序,希望你能按照這個順序來閱讀。

---
- Stanislaw Lem: Memoirs Found in a Bathtub
- Neal Stephenson: Snowcrash
- Daniel Clowes: Ghost World

上面的序列中,每一項都是一個map,當一種集合(collection )包括另一種集合時,稱作嵌套nesting)。


第三分鐘:郵箱裏的東西

第三分鐘我們先放慢一下速度,老師讓你朋友這麼打擾你我想過不多久你肯定會被氣瘋的。

冉我們來看看你的信箱。你住在一個公寓裏,你的信箱只有一個小口可以投信,旁邊是其他的幾百個信箱。

你檢查一下自己的信箱發現了五封信。兩封是給你的鄰居Jim O'Connor的,一封是給一個叫做"Hank Bros.: the Car Wash!"的公司的,其他的兩封信是你自己的。

你打算對自己郵箱裏多出來的信進行投訴,你打算給郵局發送一封信,讓他們看看這給你帶來了多大的麻煩。

你開始了一個新的YAML文檔,裏面包括今天的日期,和你的信箱裏的信件:

---
date: 2003-07-25
letters to:
  "Hank Bros.: the Car Wash!": 1
  Jim O'Connor: 2
  Myself: 2

這個例子裏,一個map嵌套了另一個map,第一個MAP的key是,它的值是letters to  一個被嵌套的MAP,第二個MAP是縮進排列的。

在PHP或者RUBY中,可以這樣訪問:

print $mailbox['letters to']['Myself'];

將會打印:

2 

你也發現了,"Hank Bros.: the Car Wash!"用雙銀號擴起來了,這是因爲這裏麪包括了冒好。否則,會引起麻煩的,你將可能弄不清哪個是key 哪個是value。


第四分鐘:更多消息

你從郵局得到了一些解釋:

---
Concerning Car Washes: >

  We are sorry to have misplaced this letter.
  We were told by a reliable source that you
  were the owner of "Hank Bros.: the Car Wash!".

  Sorry.

郵局工作有誤,但這也向我們展示了YAML的另一個特點:塊(block )。在他們的信息裏,用到了block。

在 YAML中,一個 block 是一段文本,它們縮進一個或多個空格。

注意這個大於號: >。它表示一個“folded block”的開始。所謂folded block,就是一行一行緊挨着句子將組成一個段落,這個段落就像我們讀課文那樣可以閱讀的。

上面的消息在YAML 閱讀器看來將分爲兩行,由一個回車換行分割。


Controlling Words

上面的消息還沒完,這是後面的:

Concerning "Jim O'Connor": |

  You are receiving Jim O'Connor's mail for several reasons:
  - The nameplate on your mailbox still says his name.
  - He has told our postman that you screen his mail.
  - He is living in your ceiling.
  - He held a raygun to the postmans head.

這看起來有點古怪,郵局的人用一個豎線,取代了原來的大於號,這有什麼不同嗎?

一個豎線(也稱管道pipe),表示了一個literal block的開始。 literal block 表示每個句子自成一節,這個塊將會像計算機讀取那樣,都是字面值。

YAML 閱讀器會把上面的塊當作5行(第一行是空行)。


第五分鐘:這就是全部嗎?

到現在,看起來YAML也就這麼多東西而已,它只是一些列表和字典組成的集合而已?

這只是我們五分鐘能談論到的最基本的東西,在繼續之前,來看最後一個概念。

這裏是一個人讀這個五分鐘教程所用時間的紀錄:

---
name: Dirk Hockeybranch
minutes spent: 
 - 1.02
 - 1.34
 - 0.7
 - 0.89
 - 0.94

上面我們用一個序列 (sequence)嵌套在了一個map中,序列中的每項代表了在第幾步所用的時間。如果每個人都把自己閱讀的時間像這樣寄給我們,那我們需要給本教程準備一個更準確的名字,比如YAML in Five-Point-One-Two Minutes。這將有點華而不實。(我們可能需要很多的篇幅來寫這樣的文檔。)

一個機靈的YAML用戶可能會用 inline sequence來記錄它們所用的時間:

---
name: Dirk Hockeybranch
minutes spent: [1.02, 1.34, 0.7, 0.89, 0.94]

對於短的列表,你可以把它們都房在一行裏,各項之間用逗號分割,最後用中括號括起來。

Inline maps 也類似:

---
minutes spent: {one: 1.02, two: 1.34, three: 0.7,
                four: 0.89, five: 0.94}

以上也要謹慎使用,BLOCK在inline sequences 或 Inline maps 中不能使用。


結論

看看時間,多長時間了?五分鐘?還是十分鐘?

如果你想更深入的學習YAML,我建議你去看看 YAML Cookbook,一本非常好的手冊,它將會更詳細的講解YAML,你一定會驚奇於YAML提供的功能。

最後,謝謝你花時間來閱讀這篇文章

 

譯者注:以下是我找到的一些資源,可能對你有用

1.YAML老家: http://yaml.org/

2.XML 問題:YAML 對 XML 的改進:http://www-900.ibm.com/developerWorks/cn/xml/x-matters/part23/index.shtml

3.最近推出了 YAML 規範 1.0,在 http://yaml.org/spec/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章