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