我在Perl中的哈希中声明哈希有什么问题?

时间:2012-05-03 20:12:46

标签: perl hash xml-simple

我正在努力解决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
                            }
 };

我一直在谷歌搜索,但我还没有能够提出解决方案,我所做的每一次修改都会在另一个警告或我不想要的结果中结束。

Perl投诉与以下文字:

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

我这样做,因为我想使用模块:

XML::Simple

为了生成具有以下结构的XML文件:

 <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>

所以有点像:

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

将显示后一个xml样本结构。

更新

我忘了提到我也尝试使用括号而不是花括号作为哈希引用,虽然它似乎工作,但XML文件编写不正确: 我最终得到以下结构:

<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>

这并非完全错误,但我不确定随着XML文件变大,我是否会遇到问题。凭证使用RC4算法加密,但我在base 64编码,以避免任何特殊字符的不当行为。 感谢

3 个答案:

答案 0 :(得分:13)

{}用于哈希引用。声明哈希使用普通括号()

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
                            }
 );

另见perldoc perldsc - Perl Data Structures Cookbook

答案 1 :(得分:4)

您正在使用花括号{ ... }来构造对匿名哈希的引用。您应该将其指定给标量,或将{ ... }更改为标准括号( ... )

答案 2 :(得分:4)

对于您的第二个问题,您应该记住XML::Simple对于大多数应用程序来说确实太简单了。如果您需要特定的布局,那么使用HTML::Template生成XML的方式会更好。例如(为了说明目的,我引用变量名称):

#!/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>

输出:

<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>