Perl 使用模板模块打印数据时出错

Perl 使用模板模块打印数据时出错,perl,template-toolkit,Perl,Template Toolkit,我在打印这样的数据方面没有什么问题,我已经编写了这样的脚本 [% FOREACH comp IN company %] [% comp.name %] [% comp.location%] employeedata: [% FOREACH employee IN comp.domain.java.employee %] [% FOREACH experiance IN employee.experiance %] [% FOREACH obj IN ObjectDefinition%]

我在打印这样的数据方面没有什么问题,我已经编写了这样的脚本

[% FOREACH comp IN company %]
[% comp.name %] 
[% comp.location%]
employeedata:
[% FOREACH employee IN comp.domain.java.employee %]

[% FOREACH experiance IN employee.experiance %]

[% FOREACH obj IN ObjectDefinition%]

[% FOREACH beha IN obj.experiance %]

[% IF beha.years == experiance.years %] 

 [% beha.Name %],
  [% LAST %]
 [% END %]
   [% END %]
 [% END %]
 [% END %]
[% END %]
  [% END %]
clar, larson.
clar,clar or clar.
larson,larson or larson.
per,per or per.
根据上面的脚本,比较散列中两个键中的“年”值,如果两者相同,则打印员工姓名。它的工作和它的印刷方式如下所示

如果有三个名字,它就会像这样打印出来

  clar, larson, per,
clar, larson,
如果有两个名字,它就会像这样打印出来

  clar, larson, per,
clar, larson,
但我需要像这样打印 如果有三个名字

clar, larson or per.
如果有两个像这样的名字

[% FOREACH comp IN company %]
[% comp.name %] 
[% comp.location%]
employeedata:
[% FOREACH employee IN comp.domain.java.employee %]

[% FOREACH experiance IN employee.experiance %]

[% FOREACH obj IN ObjectDefinition%]

[% FOREACH beha IN obj.experiance %]

[% IF beha.years == experiance.years %] 

 [% beha.Name %],
  [% LAST %]
 [% END %]
   [% END %]
 [% END %]
 [% END %]
[% END %]
  [% END %]
clar, larson.
clar,clar or clar.
larson,larson or larson.
per,per or per.
如果只有一个像这样的名字就好了

clar.
clar,clar.
larson,larson.
我最多只有三个名字。我需要像这样打印帮助我如何像这样打印。如果有什么错误,请原谅

我也试过这样做

 [% FOREACH employee IN comp.domain.java.employee %]

[% FOREACH experience IN employee.experience %]

[% FOREACH obj IN ObjectDefinition%]

[% FOREACH beha IN obj.experience %]

 [% IF beha.years == experience.years %]

 [% IF employee.experience.size == 1 %]
 [% beha.Name %].


 [% ELSIF employee.experience.size == 2 %]
     [% beha.Name %],[% beha.Name %].


[% ELSIF employee.experience.size == 3 %] 
 [% beha.Name %],[% beha.Name %]or[% beha.Name %].
 [% END %]
  [% END %]
  [% END %]
  [% END %]
  [% END %]
  [% END %]
但当我们有一个名字的时候,它就开始印刷了。如果我们有两个名字,它就会像这样打印出来

clar.
clar,clar.
larson,larson.
如果我们有三个名字,它就会像这样打印出来

[% FOREACH comp IN company %]
[% comp.name %] 
[% comp.location%]
employeedata:
[% FOREACH employee IN comp.domain.java.employee %]

[% FOREACH experiance IN employee.experiance %]

[% FOREACH obj IN ObjectDefinition%]

[% FOREACH beha IN obj.experiance %]

[% IF beha.years == experiance.years %] 

 [% beha.Name %],
  [% LAST %]
 [% END %]
   [% END %]
 [% END %]
 [% END %]
[% END %]
  [% END %]
clar, larson.
clar,clar or clar.
larson,larson or larson.
per,per or per.

我的脚本出了什么问题?我无法解决这个问题。任何人都可以帮助我。

第二次尝试肯定更接近您所需要的。但是循环的顺序看起来不正确
beha.Name
仅具有当前记录的值

我想你想要这样的东西:

[%  SET staff = []; # empty list 
    FOREACH beha IN obj.experience;
        staff.push(beha) IF beha.years == experience.years;
    END; %]
[%  IF staff.size == 1;
        staff.0.Name;
    ELSIF staff.size == 2;
        "$staff.0.Name, $staff.1.Name";
    ELSIF staff.size >= 3;
        "$staff.0.Name, $staff.1.Name or $staff.2.Name";
    END %] 
IF-ELSIF循环不是很漂亮,但是没有明显的staff.join()构造,它将使用逗号和文本分隔符的组合以及3个元素的限制来完成所需的工作

更新

根据要求,使用.join的示例如下:

如果您有任意长度的名称列表,您可能希望将其显示为名称、[名称,…]或名称:


但正如我前面所说,最多有3个名字,这太过分了。

感谢您的建议,您能否提供一个使用staff.join()的示例。请参阅更新的答案-我添加了一个示例。顺便说一句,TT的官方文档非常好。请查看手册中标题为“VMethods”的条目。非常感谢您提供示例。