Mam dokument YAML takiego:Jak mogę przejść drzewo YAML za pomocą YAML :: Tiny Perla?
---
version: 1
rootdirectory:
- subdirectory:
- file1
- file2
- subdirectory2
że wczytuję w YAML :: Tiny obiekt tak:
$configuration = YAML::Tiny->read($configuration_file)
widzę z wywoływania skryptu Perl z debuggera, że co i skończy się to zestaw zagnieżdżonych skrótów i tablic, które odzwierciedlają strukturę źródła 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
więc mogę robić takie rzeczy jak co następuje bez pr Oblem:
print $configuration->[0]->{version}
i otrzymasz oczekiwaną odpowiedź "1". Podobnie, mogę również:
print $configuration->[0]->{rootdirectory}->[0]->{subdirectory}->[0]
i otrzymać oczekiwaną odpowiedź "file1".
Mój problem wynika z całej wiedzy a priori potrzebnej do wyprowadzenia nazwy pliku w powyższym przykładzie. Ponieważ próbuję pozwolić użytkownikom mojego skryptu opisywać dowolną strukturę katalogów w konfiguracji YAML, nie jest to wystarczająco dobre. Muszę być w stanie "chodzić" po drzewie z "rootdirectory".
Tak, chciałbym sobie wyobrazić mogłem zrobić coś takiego:
print keys($configuration->[0])
który spodziewałem się, że wrócił „rootdirectory, wersja” ... i tak dalej, iteracja ciągu tablic i do czasu, gdy przeszedłem przez drzewo.
Gdy próbuję uruchomić powyższy przykład, uzyskać:
Type of arg 1 to keys must be hash (not array element)
W tym momencie jestem zakleszczony. Jak rozumiem, $ configuration -> [0], będąc elementem tablicy, jest elementem zawierającym skrót, który, jak sądzę, powinien być w stanie wywołać funkcję klawiszy przeciw.
Czego mi tu brakuje?
Doskonale, dziękuję! Jak rozumiem to ja po prostu potrzebuję trochę „cukier syntaktyczny” w formie% {$ konfiguracji -> [0]}, aby wymusić Perl do uwierzenia, że konfiguracja $ -> [0] jest rzeczywiście hash, a nie element tablicy tak się składa, że zawiera hasz. Czy rzetelnego komentarza? –
Tak –
Klucze słów kluczowych '()' 'jest zdefiniowany jak klucze (\%) {...}' która zmusza do korzystania hash, ale nie auto-dereference dla Ciebie. –