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

时间:2011-11-09 10:25:49

标签: 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 beha IN obj.experiance %]

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

 [% beha.Name %],
  [% LAST %]
 [% END %]
   [% END %]
 [% END %]
 [% END %]
[% END %]
  [% END %]

从上面的脚本中比较哈希中两个键中的“years”值,如果两者都相同,则打印员工姓名。它的工作和打印如下所示。

如果有三个名字就像这样打印。

  clar, larson, per,

如果有两个名字就像这样打印。

clar, larson,

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

clar, larson or per.

如果有两个名字就像这样

clar, larson.

如果只有一个这样的名字

clar.

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

我也尝试了这个

 [% 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.
larson,larson.

如果我们有三个名字就像这样打印

clar,clar or clar.
larson,larson or larson.
per,per or per.

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

1 个答案:

答案 0 :(得分:0)

第二次尝试肯定更接近你需要的东西。但循环的顺序看起来不正确。 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的示例:

如果您有一个任意长度的名称列表,您可能希望将它们显示为名称,名称,[名称,...]或名称

ELSIF staff.size >= 3;
    SET lastname = staff.pop; #remove last person from list
    staff.join(', '); " or $lastname";
END;

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