2011-08-24 18 views
6

संरक्षित करें मैं वाईएएमएल फ़ाइल से डेटा पढ़ना चाहता हूं लेकिन मुझे संरक्षित किए जाने वाले तत्वों के क्रम की आवश्यकता है।
क्या पर्ल में कोई मॉड्यूल है जिसमें यह कार्यक्षमता है और यह कैसे करें?वाईएएमएल ऑर्डर perl


जवाब में @mugen के केनिची

मैं मैं क्या चाहते हो करने में कामयाब रहे, लेकिन मैं नहीं मानता कि यह एक उचित समाधान है।

वर्ष YAML:

foo: 
    bar: some value 
    baz: other value 
qwe: 
    bar: yet another value 
    baz: again 

नई YAML

- 
    foo: 
     bar: some value 
     baz: other value 
- 
    qwe: 
     bar: yet another value 
     baz: again 
+4

यदि आदेश प्रासंगिक है तो आपको yaml में अनुक्रमों का उपयोग करना चाहिए। अपने यमल डेटा संरचना पर पुनर्विचार करें। –

+0

@mugen kenichi मैंने प्रश्न – bliof

+1

अद्यतन किया है हां वास्तव में यहां वर्णित एक आदेशित मैपिंग है http://www.yaml.org/spec/1.2/spec.html#id2765410 –

उत्तर

6

YAML spec specifically states कि और कहा कि "" मानचित्रण कुंजी एक आदेश की जरूरत नहीं है "हर मामले में जहां नोड क्रम महत्वपूर्ण, एक दृश्य है में उपयोग किया जाना चाहिए"। एक मानचित्रण से आदेश का अनुमान लगाने के लिए spec का उल्लंघन होगा। मुगेन द्वारा वर्णित आदेशित मैपिंग का उपयोग करना, आदेश को संरक्षित करने का सही समाधान है।

आप वास्तव में करना चाहता था, तो आप किसी भी तरह एक Tie::IxHash जो आदेश सुरक्षित करेगा में डंप करने के लिए एक YAML पार्सर मिल सकता है ... लेकिन मैं कोई पर्ल YAML पार्सर जो आप नियंत्रण के उस स्तर देता है के बारे में पता। यह संभव है कि आप YAML::Old::Loader के साथ कुछ कर सकें, लेकिन यह बहुत अच्छा वाईएएमएल पार्सर नहीं है और वाईएएमएल :: ओल्ड :: लोडर दस्तावेज नहीं है।

एक तीसरा विकल्प स्पष्ट YAML tags (उर्फ प्रकार) का उपयोग करना होगा ताकि पार्सर को आपके मैपिंग को एक विशेष प्रकार के रूप में लोड किया जा सके और फिर आप कॉलबैक की आपूर्ति कर सकें ... लेकिन फिर भी यह संभावना है कि वाईएएमएल पार्सर आपकी कॉलबैक की आपूर्ति करेगा एक unordered हैश के साथ।

मैं सुझाव दूंगा कि आप बस वाईएएमएल को बदल दें। एक पोर्टेबल डेटा भाषा का बिंदु यह है कि सभी अर्थपूर्ण अर्थ डेटा फ़ाइल या spec में स्पष्ट है, किसी विशेष पार्सर में अंतर्निहित नहीं है। आदेश दिया गया मैपिंग एक स्वीकार्य, कॉम्पैक्ट वाईएएमएल मुहावरे हैं।

- foo: 
     bar: some value 
     baz: other value 
- qwe: 
     bar: yet another value 
     baz: again