2009-08-12 16 views
5

मैं इस तरह एक YAML दस्तावेज़ है:मैं पर्ल के वाईएएमएल :: छोटे के साथ एक वाईएएमएल पेड़ कैसे चला सकता हूं?

--- 
version: 1 
rootdirectory: 
    - subdirectory: 
    - file1 
    - file2 
    - subdirectory2 

है कि मैं एक YAML में लोड कर रहा हूँ :: इस तरह छोटे वस्तु:

$configuration = YAML::Tiny->read($configuration_file) 

मैं पर्ल डीबगर के साथ स्क्रिप्ट लागू से देखते हैं कि क्या मैं अंत में नेस्टेड हैश और सरणियों कि YAML स्रोत की संरचना को प्रतिबिंबित का एक सेट है साथ:

0 YAML::Tiny=ARRAY(0x84e3ba4) 
    0 HASH(0x80627dc) 
     'rootdirectory' => ARRAY(0x84e3d3c) 
     0 HASH(0x84352b0) 
      'subdirectory' => ARRAY(0x84e3df0) 
       0 'file1' 
       1 'file2' 
     1 'subdirectory2' 
     'version' => 1 

तो, मैं जनसंपर्क के बिना निम्नलिखित की तरह कर सकते हैं oblem:

print $configuration->[0]->{version} 

और '1' के अपेक्षित उत्तर प्राप्त करें। इसी प्रकार, मैं यह भी कर सकता हूं:

print $configuration->[0]->{rootdirectory}->[0]->{subdirectory}->[0] 

और 'file1' का अपेक्षित उत्तर प्राप्त करें।

मेरी समस्या उपरोक्त उदाहरण में मेरे फ़ाइल नाम प्राप्त करने की आवश्यकता वाले सभी प्राथमिक ज्ञान से आता है। चूंकि मैं वाईएएमएल कॉन्फ़िगरेशन में मनमाने ढंग से निर्देशिका संरचना का वर्णन करने के लिए अपनी स्क्रिप्ट के उपयोगकर्ताओं को अनुमति देने की कोशिश कर रहा हूं, यह पर्याप्त नहीं है। मुझे 'rootdirectory' से पेड़ को "चलने" में सक्षम होना चाहिए।

तो, मुझे लगता है मैं कुछ इस तरह किया जा सकता है कल्पना होगा:

print keys($configuration->[0]) 

जो मैं वापस आ गए जाने की उम्मीद है | 'rootdirectory, संस्करण' ... और इतने पर, सरणियों से अधिक पुनरावृत्ति और हैश जब तक मैं पेड़ चला गया था।

जब मैं ऊपर के उदाहरण को चलाने के लिए प्रयास करते हैं, मैं:

Type of arg 1 to keys must be hash (not array element) 

इस बिंदु पर मैं अटक कर रहा हूँ। जैसा कि मैं इसे समझता हूं, $ कॉन्फ़िगरेशन -> [0], एक सरणी का तत्व होने के दौरान, एक हैश युक्त तत्व है जो मुझे विश्वास है कि मैं कुंजी के खिलाफ कार्य करने का प्रयास कर सकता हूं।

मुझे यहां क्या याद आ रही है?

उत्तर

5

प्रयास करें

print "$_\n" for keys %{ $configuration->[0] }; 

आप "%{...}"

तो उन पर पुनरावृति करने के साथ सरणी तत्व "$configuration->[0]" एक हैश रेफरी में मजबूर करने के लिए है:

for my $key (keys %{ $configuration->[0] }){ 
    my $value = $configuration->[0]{$key}; 

    print "$key => $value\n"; 
} 
+0

उत्कृष्ट, धन्यवाद! जैसा कि मैं इसे समझता हूं, मुझे मूल रूप से% {$ कॉन्फ़िगरेशन -> [0]} के रूप में कुछ "वाक्य रचनात्मक चीनी" की आवश्यकता होती है ताकि पर्ल को यह विश्वास हो सके कि $ कॉन्फ़िगरेशन -> [0] वास्तव में हैश है और एक सरणी तत्व नहीं है यह एक हैश शामिल होता है। क्या यह एक उचित टिप्पणी है? –

+0

हां –

+0

कीवर्ड 'कुंजी()' को 'कुंजी (\%) {...}' जैसे परिभाषित किया गया है जो आपको हैश का उपयोग करने के लिए मजबूर करता है, लेकिन आपके लिए ऑटो-डिफरेंस नहीं करता है। –

3

YAML::Tiny एक बनाता है बल्कि जटिल डेटा संरचना:

एक सरणी संदर्भ से भरा करने के लिए एक संदर्भ संदर्भ से भरा हैश को संदर्भ से भरा arrays के लिए ....

जब $a एक सरणी के लिए एक संदर्भ है, आप के रूप में @ पूरे सरणी का उपयोग करने के लिए हैश $ और $$a[0], $$a[1], के रूप में तत्व ... या वैकल्पिक रूप से $a->[0], $a->[1]

जब $b एक हैश करने के लिए एक referenc है के रूप में, आप %$b रूप में पूरे हैश और के रूप में $b->{'somekey'}, $b->{'somekey'}

$ $b{'somekey'}, $$b{'somekey'}, .... या वैकल्पिक रूप से के रूप में तत्वों तक पहुंचने देना $configuration एक है हैश के संदर्भों से भरे एक सरणी के संदर्भ में आप पूरे सरणी को @$configuration, के रूप में पहले तत्व को $configuration->[0] के रूप में एक्सेस करते हैं। तुम सिर्फ नकल कर सकता है कि एक और चर के लिए

$firstconfig = $configuration->[0] 

और उसके बाद के रूप में

%$firstconfig 

पूरे हैश का उपयोग लेकिन जाने के लिए आप नहीं बल्कि मुश्किल लिखने के लिए है, तो आप एक में क्या करना चाहते हैं

%{ $configuration->[0] } 

मुझे लगता है कि यह उन चीजों में से एक है जिन्हें पर्ल 6.

+0

उनमें से कुछ * बदल गया * है, लेकिन इसमें से कुछ अभी भी पर्ल 6 में मौजूद है। –

+0

वाईएएमएल :: छोटा बस धारावाहिक डेटा संरचना का पुनर्निर्माण करता है। जटिलता का स्रोत वाईएएमएल दस्तावेज़ को पार्स किया जा रहा है। –

+0

इससे मुझे बहुत ज्यादा मदद मिली। मैं perlreftut और perldsc पढ़ रहा है और हैश और सरणी संदर्भों के साथ हमेशा के लिए अटक गया है और दृष्टि में कोई वास्तविक डेटा नहीं है। मैं अभी भी पूरी तरह से समझ में नहीं आता, लेकिन कम से कम मैं जवाब से ज्ञान के लिए अपना रास्ता काम कर सकता हूं। – djeikyb

संबंधित मुद्दे