【问题标题】:What is wrong with my declaration of a hash inside a hash in Perl?我在 Perl 的散列中声明散列有什么问题?
【发布时间】:2012-05-03 20:12:45
【问题描述】:

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

【问题讨论】:

    标签: perl hash xml-simple


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      对于第二个问题,您应该记住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>
      

      【讨论】:

      • 谢谢!我对 Perl 很陌生,我不知道这种库。这个完全按照我想要的方式完成了工作。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-23
        • 2012-10-24
        • 1970-01-01
        • 2017-05-08
        • 2013-09-10
        • 2013-07-19
        • 1970-01-01
        • 2011-03-13
        相关资源
        最近更新 更多