1

script-startupで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',''])])]));

それはうまくいきました。

ポップアップメニューの-values-parameterをスカラー変数に入れようとすると、問題が発生します。どういうわけかそれに似ているはずです:

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

または一重引用符で囲みます。

目標は、xmlファイルの構文が修正された要素を連結してその文字列を作成することです。それは、オプトグループまたはオプトグループ内のリスト要素がいくつ存在するかをアプリオリに知らないためです。何か案が?

事前にThx

Jochen

4

1 に答える 1

1

その文字列を生成するために使用する XML ファイルがありますか? popup_menu呼び出しに必要なデータ構造を直接生成しないのはなぜですか? これは単なる配列です ( optgroupXML ファイルの「分析」中に呼び出すことができます)。

本当に文字列ソリューションを使用したい場合は、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 に答える