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

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>
于 2012-05-03T20:35:43.957 に答える