2012-05-03 46 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 
          } 
}; 

我一直在使用Google,但我一直沒能拿出一個解決方案,並且每次修改我在做結束另一個警告或者我不想要的結果。

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> 

所以sometthing,如:

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

對於你的第二個問題,你應該記住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> 
+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

您正在使用大括號{ ... }構建對匿名散列的引用。您應該將其分配給標量,或將{ ... }更改爲標準圓括號(...)