2016-04-25 37 views
2

我試圖加載使用Perl一個 「簡單」 YAML文件:在YAML模塊中別名解析不正確?

foo: &baz 
    dog: cat 
    cat: rat 
bar: 
    <<: *baz 
    rat: cheese 

使用YAMLYAML::XS,或YAML::Syck我得到意想不到的輸出從test script

{ 
    'foo' => { 
    'cat' => 'rat', 
    'dog' => 'cat' 
    }, 
    'bar' => { 
    'rat' => 'cheese', 
    '<<' => $VAR1->{'foo'} 
    } 
} 

在這情況下,{bar}->{dog}undef。通過YAML Lint(或甚至Ruby's YAML module)運行相同的輸入,它按預期輸出。

如何讓Perl解析並輸出正確的格式?

回答

2

YAML和YAML :: Syck不支持merge key language-independent type是合乎邏輯的,因爲這些解析器實現了YAML 1.0,並且該擴展被提議用於YAML 1.1。

該擴展不是YAML 1.1規範的一部分, YAML :: XS基於的libyaml不支持它自己。 Ruby,Python和JavaScrip YAML解析器在libyaml庫之上實現了合併,這是YAML :: XS似乎沒有做到的。

由於@bart評論,也有一些解決方法通過加載後遍歷樹:http://www.perlmonks.org/?node_id=813443

+0

所以基本上我不得不叉這些模塊和補丁代碼的一個解析別名(這似乎成爲其中的一部分YAML 1.2?不能說我熟悉閱讀語言規範)。 –

+3

有Perl解決方法,例如:http://www.perlmonks.org/?node_id=813443 – bart

+0

如果您確實從基於libyaml的YAML :: XS開始。或者,您可以使用支持合併的解析器預處理文件,方法是讀取文件並將其寫回。除了我的用於Python的ruamel.yaml解析器,它保留了往返時的合併,所有其他解析器將「解除合併」映射,然後您可以使用任何這些庫將它讀入Perl。 – Anthon