¿Qué tiene de malo mi declaración de un hash dentro de un hash en Perl?

Estoy luchando con la siguiente declaración de hash en Perl:

my %xmlStructure = {
            hostname    =>  $dbHost,
            username    =>  $dbUsername,
            password    =>  $dbPassword,
            dev_table   =>  $dbTable,
            octopus     =>  {
                                alert_dir       =>  $alert_dir,
                                broadcast_id    =>  $broadcast_id,
                                system_id       =>  $system_id,
                                subkey          =>  $subkey
                            }
 };

He estado buscando en Google, pero no he podido encontrar una solución, y cada modificación que hago termina en otra advertencia o en resultados que no quiero.

Quejas de Perl con el siguiente texto:

Reference found where even-sized list expected at ./configurator.pl line X.

Lo estoy haciendo de esa manera, ya que quiero usar el módulo:

XML::Simple

Para generar un archivo XML con la siguiente estructura:

 <settings>
  <username></username>
  <password></password>
  <database></database>
  <hostname></hostname>

  <dev_table></dev_table>

  <octopus>
      <alert_dir></alert_dir>
      <broadcast_id></broadcast_id>
      <subkey></subkey>
  </octopus>
 </settings>

entonces algo como:

my $data = $xmlFile->XMLout(%xmlStructure);
warn Dumper($data);

mostraría la última estructura de muestra xml.

Actualizar:

Olvidé mencionar que también intenté usar paréntesis en lugar de llaves para la referencia hash, y aunque parece funcionar, el archivo XML no está escrito correctamente: termino con la siguiente estructura:

<settings>

 <dev_table>5L3IQWmNOw==</dev_table>
 <hostname>gQMgO3/hvMjc</hostname>

 <octopus>
  <alert_dir>l</alert_dir>
  <broadcast_id>l</broadcast_id>
  <subkey>l</subkey>
  <system_id>l</system_id>
 </octopus>

 <password>dZJomteHXg==</password>
 <username>sjfPIQ==</username>

</settings>

Lo cual no es exactamente incorrecto, pero no estoy seguro de si voy a tener problemas más adelante a medida que el archivo XML crezca. Las credenciales están encriptadas usando el algoritmo RC4, pero estoy codificando en base 64 para evitar cualquier mal comportamiento con caracteres especiales. Gracias

preguntado el 03 de mayo de 12 a las 21:05

3 Respuestas

{} se utilizan para referencias hash. Para declarar un hash use paréntesis normales ():

my %xmlStructure = (
            hostname    =>  $dbHost,
            username    =>  $dbUsername,
            password    =>  $dbPassword,
            dev_table   =>  $dbTable,
            octopus     =>  {
                                alert_dir       =>  $alert_dir,
                                broadcast_id    =>  $broadcast_id,
                                system_id       =>  $system_id,
                                subkey          =>  $subkey
                            }
 );

Véase también perldoc perldsc - Libro de recetas de estructuras de datos de Perl.

contestado el 03 de mayo de 12 a las 21:05

Para su segundo problema, debe tener en cuenta que XML :: Simple es de hecho demasiado simple para la mayoría de las aplicaciones. Si necesita un diseño específico, estará mejor con una forma diferente de producir el XML, por ejemplo, usando HTML :: Plantilla. Por ejemplo (cito los nombres de las variables con fines ilustrativos):

#!/usr/bin/env perl

use strict; use warnings;
use HTML::Template;

my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(
    hostname    =>  '$dbHost',
    username    =>  '$dbUsername',
    password    =>  '$dbPassword',
    dev_table   =>  '$dbTable',
    octopus     =>  [
        {
            alert_dir       =>  '$alert_dir',
            broadcast_id    =>  '$broadcast_id',
            system_id       =>  '$system_id',
            subkey          =>  '$subkey',
        }
    ]
);

print $tmpl->output;

__DATA__
<settings>
  <username><TMPL_VAR username></username>
  <password><TMPL_VAR password></password>
  <database><TMPL_VAR database></database>
  <hostname><TMPL_VAR hostname></hostname>

  <dev_table><TMPL_VAR dev_table></dev_table>

  <octopus><TMPL_LOOP octopus>
    <alert_dir><TMPL_VAR alert_dir></alert_dir>
    <broadcast_id><TMPL_VAR broadcast_id></broadcast_id>
    <subkey><TMPL_VAR subkey></subkey>
    <system_id><TMPL_VAR system_id></system_id>
  </TMPL_LOOP></octopus>
</settings>

Salida:

<settings>
  <username>$dbUsername</username>
  <password>$dbPassword</password>
  <database></database>
  <hostname>$dbHost</hostname>

  <dev_table>$dbTable</dev_table>

  <octopus>
    <alert_dir>$alert_dir</alert_dir>
    <broadcast_id>$broadcast_id</broadcast_id>
    <subkey>$subkey</subkey>
    <system_id>$system_id</system_id>
  </octopus>
</settings>

contestado el 03 de mayo de 12 a las 21:05

¡Gracias! Soy bastante nuevo en Perl y no conozco este tipo de bibliotecas. Este hizo el trabajo exactamente como yo quería. - Me gustan los tacos

Estás usando las llaves { ... } para construir una referencia a un hash anónimo. Debe asignar eso a un escalar, o cambiar el { ... } a paréntesis estándar ( ... ).

contestado el 03 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.