我正在努力解决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编码,以避免任何特殊字符的不当行为。 感谢
答案 0 :(得分: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
}
);
答案 1 :(得分:4)
您正在使用花括号{ ... }
来构造对匿名哈希的引用。您应该将其指定给标量,或将{ ... }
更改为标准括号( ... )
。
答案 2 :(得分:4)
对于您的第二个问题,您应该记住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>