我正在尝试创建一个动态下拉菜单,它在脚本启动时从xml文件中接收其条目。 首先我尝试了这样的静态版本:
Tr(td([popup_menu( -name=>'betreff', -values=>[optgroup(-name=>'Mädels',
-values=>['Susi','Steffi',''], -labels=>{'Susi'=>'Petra','Steffi'=>'Paula'})
,optgroup(-name=>'Jungs', -values=>['moe', 'catch',''])])]));
工作正常。
当我尝试将popup_menu的-values-parameter放入标量变量时,prob开始了。 应该以某种方式类似于那个:
$popup_values = "[optgroup(-name=>'Mädels', -values=>['Susi','Steffi',''],
-labels=>{'Susi'=>'Petra','Steffi'=>'Paula'}),optgroup(-name=>'Jungs',
-values=>['moe', 'catch',''])]"
或单引号。
目标是通过连接xml文件的语法校正元素来构建该字符串。那是因为我不知道有多少optgroups中的optgroups或list元素将存在。 有什么想法吗?
提前谢谢
约亨
答案 0 :(得分:1)
所以你有一个用来生成该字符串的XML文件?为什么不直接生成popup_menu
调用所需的数据结构?它只是一个数组(您可以在“分析”XML文件时调用optgroup
)
如果您真的想使用字符串解决方案,那么您可以使用eval将字符串转换为数据结构。虽然此解决方案存在某些安全问题。
以下是如何将表单XML转换为optgroup的示例,这当然取决于XML文件的外观。
use strict;
use warnings;
use XML::Simple;
use CGI qw/:standard/;
my $xmlString = join('', <DATA>);
my $xmlData = XMLin($xmlString);
my @popup_values;
foreach my $group (keys(%{$xmlData->{group}})) {
my (@values, %labels);
my $options = $xmlData->{group}->{$group}->{opt};
foreach my $option (keys(%{$options})) {
push @values, $option;
if(exists($options->{$option}->{label}) &&
'' ne $options->{$option}->{label}) {
$labels{$option} = $options->{$option}->{label};
}
}
push @popup_values, optgroup(-name => $group,
-labels => \%labels,
-values => \@values
);
}
print popup_menu(-name=>'betreff', -values=> \@popup_values);
__DATA__
<?xml version="1.0" encoding="UTF-8" ?>
<dropdown>
<group name="Mädels">
<opt name="Susi" label="Petra"/>
<opt name="Steffi" label="Paula"/>
<opt name="" />
</group>
<group name="Jungs">
<opt name="moe" />
<opt name="catch" />
<opt name="" />
</group>
</dropdown>