2012-05-03 12 views
1

私はPerlでのハッシュの次の宣言に苦しんでいます:私はグーグルでてきたが、私は解決策を考え出すことができていない、と私が作るすべての変更がで終わる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 
          } 
}; 

別の警告または私が欲しくない結果になります。私はモジュールを使用したいので、私は、そのようにやっている

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

XML::Simple 

次のXMLファイルを生成するために、次のテキスト

Perlの苦情構造:

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

はそうのようなsometthing

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

は、後者のxmlサンプル構造を表示します。

更新:

私はまた、ハッシュリファレンスの代わりに中括弧の括弧を使用してみました、そして本家動作しているように、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> 

次の構造を持ちます。資格情報はRC4アルゴリズムを使用して暗号化されていますが、特殊文字による誤動作を避けるため、ベース64でエンコードしています。 ありがとう

答えて

4

2番目の問題については、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> 
+0

ありがとうございます!私はPerlにはかなり新しく、この種のライブラリは認識していません。これは、私が望んだ通りに仕事をしました。 – ILikeTacos

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を参照してください。

4

中括弧{ ... }を使用して、匿名ハッシュへの参照を作成しています。スカラーに割り当てるか、{ ... }を標準カッコの(...)に変更する必要があります。

関連する問題