Perl 如何使用模板模块打印数据

Perl 如何使用模板模块打印数据,perl,template-toolkit,Perl,Template Toolkit,我的英语有点差,所以如果我不懂,请不要犹豫。 我对perl模板工具包模块有问题。这是我第一次使用这个模块,我从文件中读取xml数据,并使用xml::Simple(ForceArray)进行解析,使用data::Dumper进行打印。正在打印数据 $var1={ 'data'=>{ 'employee'=>[ { 'name'

我的英语有点差,所以如果我不懂,请不要犹豫。 我对perl模板工具包模块有问题。这是我第一次使用这个模块,我从文件中读取xml数据,并使用xml::Simple(ForceArray)进行解析,使用data::Dumper进行打印。正在打印数据

$var1={

       'data'=>{
                  'employee'=>[
                            {
                           'name'=>'suraj',
                           'number'=>'f11a0478',
                           'adress'=>' badvel,kadapa,a.p,india',
                            },

                           {
                           'name'=>'misra',
                           'number'=>'047902',
                           'adress'=>' raipur,ananthapur,a.p,india',
                            }...........
                             ...........
                          ],          

    'company'=>{
              'name'=>'bosch',
              'location'=>'banglore',
              'domain'=>{
                     'java'=>{
                            'employee'=>[
                                     {
                                    'name'=>'suraj',

                                    'number'=>'f11a0478',

                                    'experience'=>{
                                              'years'=>'3',
                                              'projects'=>'4',

                                              }
                                           },
                                   {
                                    'name'=>'misra',

                                    'number'=>'047902',

                                    'experience'=>[
                                                 {
                                                  'years'=>'1',

                                                  'projects'=>'1',

                                                  },
                                                 {
                                             'years'=>'1',

                                             'projects'=>'1',

                                              }
                                             ]
                                           },   
                                          ]
                            }
                    }................
                    .................
             };
我使用的模板工具包过程如下,并打印在一些文件中,我编写的代码如下

[% FOREACH comp IN company %]
[% comp.name %] 
[% comp.location%]
employeedata:
[% FOREACH employee IN comp.domain.java.employee %]
employee name: [% employee.name +%] numb [%+ employee.number %]
   [% FOREACH experience IN employee. experience %]
[% experience.years %]
[% experience.projects %]
 [% END %]
 [% END %]
[% END %]

从上面的脚本,我能够打印公司员工,姓名,号码,经验,年份,项目。但我的问题是,我还需要将员工的地址添加到此信息中。我正在打印“公司”节点中的所有信息以及所有公司的信息。但地址位于散列中的其他某个键。通过使用员工姓名和编号(一些员工姓名相同,一些员工编号相同),我需要找到地址并在员工详细信息中打印地址。帮我解决这个问题。我现在应该做什么,如何解决这个问题。

您可以做:

[% FOREACH de IN data.employee %]
  [% IF de.name == employee.name && de.number == employee.number %]
    [% de.address %]
    [% LAST %]
  [% END %]
[% END %]
不过,我建议在使用TT处理数据结构之前对其进行一些处理,因为这不是很有效。如果comp.domain.java.employee和data.employee包含相同数量的元素,那就相当简单了

编辑:我在下面的评论中的意思是

[% FOREACH employee IN comp.domain.java.employee %]
  [% addresses = [] %]
  [% FOREACH de IN data.employee %]
    <!-- Name, experience etc. -->
    <!-- Then new address stuff: -->
    [% IF de.name == employee.name || de.number == employee.number %]
      [% addresses.push(de.address) %]
    [% END %]
  [% END %]
  [% addressStr = addresses.join(', '); addressStr.replace(', ([^,]+)$', ' or $1') %]
  [% addressStr %]
[% END %]
[%FOREACH employee IN comp.domain.java.employee%]
[%addresses=[]%]
[%FOREACH de IN data.employee%]
[%IF de.name==employee.name | | de.number==employee.number%]
[%addresses.push(de.address)%]
[%END%]
[%END%]
[%addressStr=addresses.join(',');addressStr.replace(',([^,]+)$,'或$1')%]
[%addressStr%]
[%END%]

这不是打印地址,比如
address1、address2或address3

“通过使用员工姓名和号码(一些员工有相同的姓名,一些员工有相同的号码)”您的意思是姓名也是唯一的标识符吗?非常感谢,这对我来说很好,而且输出也很好。但是你说在处理之前做点什么意味着我需要改变数据结构。这只是一个建议,因为将当前地址与其他数据放在同一个哈希中表示是有意义的。如果您的数据集不太大,可能没什么大不了的。是的,您完全正确,我的数据非常简单,上面的过程很好。非常感谢您的宝贵建议。很抱歉在这里提出问题,在我发布的问题中,我在employee下有两个员工姓名,因此它执行了两次并打印了两个员工的地址,但问题是它组合打印了两个员工地址,所以我在您的代码[%de.address%]中放置了这样的coma,在这之后,它打印了这样的地址1,地址2,如果我在员工标签下有三个名字,它会像这样打印地址1,地址2,地址3,但我怎么能像这样打印地址1,地址2。如果有三个名字像这个地址1,地址2或地址3。你能告诉我怎么做吗?这是未经测试的,但可能类似于
[%addresses=[]%[%FOREACH de IN data.employee%[%IF de.name==employee.name&&de.number==employee.number%[%address][%END%[%END%[%addressStr=addresses.join(',');addressStr.replace(',([^,]+)$,'和$1')%][%addressStr%]