也因為能夠在Perl程式中簡單隨意的使用常規表示式,所以很快的便摸熟了一些基本的用法,這種可以方便實驗(Edit & Run)的學習模式,提昇了吸收新東西的速度。
雖然之前已經能夠快速的讀入聖經文字檔,使用常規表示法來檢索聖經內容,但是我沒有辦法區分新約與舊約、列出特定連續章節、中英文對照等等,原因是,原始文字檔案只有文字本身而沒有結構!
「YAML 」是另外一個奇特的東西。
簡單的說,YAML是human-readable的類XML,透過資料的縮排,來代表(imply,也符合人類視覺的直覺)資料間的從屬、順序、對應等關係。
我將原來的檔案整理成YAML檔結果就像下面這個樣子。
<<舊約>>
<<卷名>>
有了YAML文件後,如果要知道舊約有幾篇,新約又有幾篇,可以使用以下程式碼:
use strict;
use YAML qw /LoadFile DumpFile/;
# 將聖經目錄讀入$bindx純量變數內
my $bindx = LoadFile('bible_index.yaml');
my $nOld = grep { /old/ } keys %$bindx;
my $nNew = grep { /new/ } keys %$bindx;
printf "聖經裡面,舊約有%d篇,而新約有%d篇。\n", $nOld, $nNew;
輸出結果:聖經裡面,舊約有39篇,而新約有27篇。
如果要列出《箴言》內容,可以使用以下程式碼:
use strict;
use YAML qw /LoadFile DumpFile/;
# 將所有舊約內容讀入$bible純量變數內
my $bible = LoadFile('bible_old.yaml');
my $bindx = LoadFile('bible_index.yaml');
my $old_20 = $bible->{'old-20'};
printf "《%s》\n",
$bindx->{'old-20'}{chn};
for my $index ( sort keys %{$old_20} ) {
printf "%s %s\n",
$index,
$old_20->{$index}{word};
}
輸出結果:《箴言》 001:001 以色列王大衛兒子所羅門的箴言. 001:002 要使人曉得智慧和訓誨.分辨通達的言語. 001:003 使人處事.領受智慧、仁義、公平、正直的訓誨. 001:004 使愚人靈明、使少年人有知識和謀略. 001:005 使智慧人聽見、增長學問、使聰明人得著智謀、 001:006 使人明白箴言和譬喻、懂得智慧人的言詞和謎語。 001:007 敬畏耶和華是知識的開端.愚妄人藐視智慧和訓誨。 ...... ......
透過YAML建立了Perl的內部資料結構之後,如果有需要轉成XML格式檔,也是相當直覺與容易的,如下。
use XML::Simple;
# 存成XML格式檔
open my $fh, '>', 'bible_old_20.xml'
or die "$!";
XMLout($old_20, OutputFile => $fh);
close $fh;
XML檔案內容:在學習Perl的過程中,我知道了YAML以及XML這兩種新的文字資料格式,雖然這兩種格式背後仍有許多細節、應用與注意事項,但經由這些小小的練習,讓我有了熟悉的感覺,建立起學習更多細節的信心,而不再是難以入門的鬱卒。(這是我曾經看了一本「XML入門」之後的感覺)<001:001 index="1:1" word="以色列王大衛兒子所羅門的箴言." /> <001:002 index="1:2" word="要使人曉得智慧和訓誨.分辨通達的言語." /> <001:003 index="1:3" word="使人處事.領受智慧、仁義、公平、正直的訓誨." /> <001:004 index="1:4" word="使愚人靈明、使少年人有知識和謀略." /> <001:005 index="1:5" word="使智慧人聽見、增長學問、使聰明人得著智謀、" /> <001:006 index="1:6" word="使人明白箴言和譬喻、懂得智慧人的言詞和謎語。" /> <001:007 index="1:7" word="敬畏耶和華是知識的開端.愚妄人藐視智慧和訓誨。" /> ...... ......
參考文章: XML Matters: YAML improves on XML


沒有留言:
張貼留言