1

我正在尝试创建一个动态下拉菜单,该菜单在脚本启动时从 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 放入标量变量时,问题就开始了。应该以某种方式类似于那个:

$popup_values = "[optgroup(-name=>'Mädels', -values=>['Susi','Steffi',''], 
-labels=>{'Susi'=>'Petra','Steffi'=>'Paula'}),optgroup(-name=>'Jungs', 
-values=>['moe', 'catch',''])]" 

或用单引号。

目标是通过连接 xml 文件的语法更正元素来构建该字符串。那是因为我不知道有多少 optgroup 或 optgroup 中的列表元素将存在。任何想法?

提前谢谢

约臣

4

1 回答 1

1

那么您有一个用于生成该字符串的 XML 文件?popup_menu为什么不直接生成调用所需的数据结构呢?它只是一个数组(您可以optgroup在“分析”XML 文件时调用)

如果您真的想使用字符串解决方案,那么您可以使用eval将字符串转换为数据结构。尽管此解决方案存在某些安全问题。

从 XML 文件中读取

这是一个如何将表单 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>
于 2011-08-09T05:24:29.690 回答