كيف يمكنني المشي شجرة Yaml مع Yaml's Yaml في بيرل :: Tiny؟

StackOverflow https://stackoverflow.com/questions/1267266

  •  13-09-2019
  •  | 
  •  

سؤال

لدي وثيقة YAML مثل هذا:

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

أنني أقوم بتحميل كائن يامل :: Tiny مثل هذا:

$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

لذلك، يمكنني أن أفعل أشياء مثل ما يلي دون مشكلة:

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

واستلم الإجابة المتوقعة من "1". وبالمثل، يمكنني أيضا القيام به:

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

واستلم الإجابة المتوقعة من "file1".

تأتي مشكلتي من كل المعرفة البسيطة التي أحتاج إليها لاستقشام اسم الملف الخاص بي في المثال أعلاه. نظرا لأنني أحاول السماح لمستخدمي البرنامج النصي بصفية بنية دليل تعسفي في تكوين YAML هذا ليس جيدا بما فيه الكفاية. أحتاج إلى أن أكون قادرا على "المشي" الشجرة من "التهابئ".

لذلك، كنت أتخيل أنني قد فعلت شيئا مثل هذا:

print keys($configuration->[0])

الذي كنت أتوقع أن أعيد "الإصدار الجذر، الإصدار" ... وهكذا، تكرار حول المصفوفات والتجزح حتى مشيت الشجرة.

عندما أحاول تشغيل المثال أعلاه، أحصل على:

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

في هذه المرحلة أنا عالقة. كما أفهمها، التكوين $ -> [0]، أثناء كونها عنصر من عناصر صفيف، هو عنصر يحتوي على التجزئة وأعتقد أنني يجب أن أكون قادرا على استدعاء وظيفة المفاتيح ضد.

ما أنا في عداد المفقودين هنا؟

هل كانت مفيدة؟

المحلول

يحاول

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

عليك أن تجبر عنصر الصفيف "$configuration->[0]"في التجزئة المرجع مع"%{...}"

لذلك لتكرار أكثر منهم:

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

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

نصائح أخرى

YAML::Tiny يخلق بنية بيانات معقدة إلى حد ما:

إشارة إلى مجموعة مليئة بالإشارات إلى التجزئة مليئة بالمراجع إلى صفائف مليئة بالإشارات إلى التجزئة ....

متي $a هو مرجع إلى صفيف، يمكنك الوصول إلى الصفيف بأكمله كما @ $ A والعناصر $$a[0], $$a[1], ... أو بدلا من ذلك $a->[0], $a->[1]

متي $b هو إحالة إلى التجزئة، يمكنك الوصول إلى التجزئة بأكملها %$bوالعناصر كما $$b{'somekey'}, $$b{'somekey'},.... أو بدلا من ذلك $b->{'somekey'}, $b->{'somekey'}

متي $configuration هو مرجع إلى صفيف مليء بالمراجع إلى HASHING يمكنك الوصول إلى الصفيف بأكمله @$configuration، العنصر الأول $configuration->[0]. وبعد يمكنك فقط نسخ ذلك إلى متغير آخر

$firstconfig = $configuration->[0]

ثم الوصول إلى التجزئة بأكملها

%$firstconfig

ولكن إذا كنت ترغب في القيام بذلك في إحدى الذهاب، عليك كتابة صعبة إلى حد ما

%{ $configuration->[0] }

أعتقد أن هذا هو أحد الأشياء التي تمت إزالةها ل PERL 6.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top