Tengo un documento YAML como esto:¿Cómo puedo caminar un árbol YAML con Perl's YAML :: Tiny?
---
version: 1
rootdirectory:
- subdirectory:
- file1
- file2
- subdirectory2
que yo estoy cargando en un YAML :: Tiny objeto de esta manera:
$configuration = YAML::Tiny->read($configuration_file)
veo de invocar el script con el depurador Perl que lo termino con un conjunto de hashes y arrays anidados que reflejan la estructura de la fuente 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
lo tanto, puedo hacer cosas como lo siguiente sin pr oblem:
print $configuration->[0]->{version}
y recibe la respuesta esperada de '1'. Del mismo modo, también puedo hacer:
print $configuration->[0]->{rootdirectory}->[0]->{subdirectory}->[0]
y recibir la respuesta esperada de 'archivo1'.
Mi problema proviene de todo el conocimiento a priori que necesito para derivar mi nombre de archivo en el ejemplo anterior. Como estoy tratando de permitir que los usuarios de mi script describan una estructura de directorios arbitraria en la configuración de YAML, esto no es suficiente. Necesito poder "caminar" el árbol desde 'rootdirectory'.
Por lo tanto, lo que hubiera imaginado que podría haber hecho algo como esto:
print keys($configuration->[0])
la que yo habría esperado de haber regresado 'RootDirectory, la versión' ... y así sucesivamente, interactuando sobre las matrices y hashes hasta que había caminado el árbol.
Cuando intento ejecutar el ejemplo anterior, me sale:
Type of arg 1 to keys must be hash (not array element)
En este punto estoy atascado. Tal como lo entiendo, $ configuration -> [0], a pesar de ser un elemento de una matriz, es un elemento que contiene un hash que creo que debería poder invocar contra la función de las teclas.
¿Qué me falta aquí?
Excelente, gracias! Según tengo entendido, básicamente necesito algo de "azúcar sintáctico" en forma de% {$ configuración -> [0]} para forzar a Perl a creer que $ configuración -> [0] es en realidad un hash y no un elemento de matriz eso sucede que contiene un hash. ¿Es eso un comentario justo? –
Sí –
La palabra clave 'keys()' se define como 'keys (\%) {...}' lo que obliga a usar un hash, pero no elimina la desreferencia automática. –