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

나는 인터넷 검색을 봤는데, 그러나 나는 해결책을 마련하지 못하고, 내가 만드는 모든 수정에 종료 다른 경고 또는 결과에 내가 원하지 않는. 다음 텍스트로

펄 불만 :

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

내가 모듈을 사용하고자하기 때문에 나는 그런 식으로 일을 오전 다음과 XML 파일을 생성하기 위해

XML::Simple 

구조 :

<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

두 번째 문제는 대부분의 응용 프로그램에서 XML::Simple이 실제로 너무 간단하다는 것을 명심해야합니다. 특정 레이아웃이 필요한 경우 HTML::Template을 사용하여 다른 방식으로 XML을 작성하는 것이 좋습니다. 예를 들어 (I는 설명을위한 변수 이름을 인용) :

#!/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

익명 해시에 대한 참조를 생성하려면 중괄호 { ... }을 사용하고 있습니다. 스칼라에 할당하거나 { ... }을 표준 괄호 (...)으로 변경해야합니다.