2010年6月30日 星期三

Perl學習之旅的回顧(之二)

要檢索文字,必須知道什麼是「常規表示式」(Regular Expression),這是我透過Perl認識的一樣奇特的知識。
也因為能夠在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檔案內容:


<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="敬畏耶和華是知識的開端.愚妄人藐視智慧和訓誨。" />
......
......

在學習Perl的過程中,我知道了YAML以及XML這兩種新的文字資料格式,雖然這兩種格式背後仍有許多細節、應用與注意事項,但經由這些小小的練習,讓我有了熟悉的感覺,建立起學習更多細節的信心,而不再是難以入門的鬱卒。(這是我曾經看了一本「XML入門」之後的感覺)

參考文章: XML Matters: YAML improves on XML

沒有留言:

張貼留言