1

我正在努力处理 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 编码以避免任何带有特殊字符的不当行为。谢谢

4

3 回答 3

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 数据结构说明书

于 2012-05-03T20:17:15.807 回答
4

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

于 2012-05-03T20:17:20.203 回答
4

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

#!/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>
于 2012-05-03T20:35:43.957 回答