无法在对 XML::Generator 的调用中循环

Unable to loop inside a call to XML::Generator

我正在尝试使用 for 循环将数组 @cpuinfo 中的每个项目放入单独的 <cpu> 元素中 在 XML 文档中 使用 XML::Generator.

# @cpuinfo contain cpu information of multiple cpu's
use XML::Generator;

my $gen = XML::Generator->new( 'escape' => 'always', 'pretty' => 10 );

my $xml = $gen->servers(
   $gen->server(

      $gen->cpuinfo(

         foreach $r (@cpuinfo){
            $gen->cpu;
            (  {  $gen->cpu( @cpuinfo[$r] );
               }
            )
         }

      )
   ),
);

您似乎对 Perl 一点也不熟悉,这不是教程的地方,但是大多数语言不允许您将可执行循环放入参数列表中。您需要的是调用 map,将一个数据列表 "maps" 转换为另一个数据列表。在本例中,它将 @cpuinfo 中的文本项列表映射到 XML::Generator 对象列表,每个对象代表一个 <map> 元素

请记住,您 必须始终 use strictuse warnings 'all' 每个 Perl 程序的顶部编写并声明每个带有 my 的变量尽可能接近它的第一个使用点,最好是在它被定义的地方

use strict;
use warnings 'all';

use XML::Generator;

my @cpuinfo = qw/ A B C /;

my $gen = XML::Generator->new( escape => 'always', pretty => 2 );

my $xml = $gen->servers(
    $gen->server(
        $gen->cpuinfo(
            map { $gen->cpu($_) } @cpuinfo
        )
    )
);

print $xml, "\n";

输出

<servers>
  <server>
    <cpuinfo>
      <cpu>A</cpu>
      <cpu>B</cpu>
      <cpu>C</cpu>
    </cpuinfo>
  </server>
</servers>