【问题标题】:find hash value from key in template toolkit从模板工具包中的键中查找哈希值
【发布时间】:2015-12-07 08:51:56
【问题描述】:

有简单的散列,用于填充选择选项。我想按值排序,但我无法打印键...

[%- FOREACH val IN myList.values.sort -%]<option value="[%- myList.$val.key -%]">[%- val -%]</option>[% END %]

KEY 即将为空.....我尝试了很多方法,但它不起作用。

所以选择选项如下:

<option value="">roger1</option>

所有键和值都是唯一的。

如果我知道值,如何从哈希中获取密钥?

【问题讨论】:

  • 哈希旨在快速提取给定键的值,但反之则必须遍历哈希的所有键值对。

标签: perl template-toolkit


【解决方案1】:

您可以使用pairs vmethod 获取键/值对列表,然后您可以按照您想要的顺序对其进行排序。

[% myList = { first => 'ZZZ', second => 'YYY', third => 'XXX' };
   FOREACH option IN myList.pairs.sort('value') -%]
<option value="[% option.key %]">[% option.value %]</option>
[% END -%]

输出:

<option value="third">XXX</option>
<option value="second">YYY</option>
<option value="first">ZZZ</option>

【讨论】:

    【解决方案2】:

    通过实现自定义的按值排序,这很容易做到:

    my @keys = sort { $hash{$a} cmp $hash{$b} } keys(%hash);
    

    不幸的是,查看 TT 中可用的hash virtual methods,我认为没有办法仅在您的模板中执行此操作。您需要先在代码中稍微处理一下数据,或者通过上面的sort,或者通过反转哈希:

    my %inverted = reverse(%hash);
    

    如果您反转哈希,您可以使用 TT pairs 方法一次性获取键/值对的排序列表。

    【讨论】:

    • 如果有办法在模板中做到这一点,不要。这不是正确的地方,完全可读的代码在 TT 中变得可怕,因为它提供了一些简单的方法来显示在其他地方准备的数据,而不是编码。
    • 同意。控制器是按摩数据的好地方。
    猜你喜欢
    • 2014-01-30
    • 2012-09-06
    • 2019-05-29
    • 2019-07-12
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多