按值而不是模板工具包中的键对哈希引用进行排序

问题描述

我有一个perl多维哈希引用,该引用以以下方式在Template Toolkit中进行了迭代。是否可以通过像AVG这样的值之一而不是键来对它进行排序?

   <tr>
   <% FOREACH name in payload_batting.keys.sort %>
   <td width="140"><% name.substr(0,18);%></td>
   <td width="55"><% payload_batting.$name.atts %></td>
   <td width="55"><% payload_batting.$name.runs %></td>
   <td width="55"><% payload_batting.$name.hits %></td>
   <td width="55"><% payload_batting.$name.AVG %></td>        
   <tr>
   <% END %>

解决方法

正如池上所说,您必须自己进行排序。如果要在表示层中进行排序,请在Template Toolkit中,将其本身作为Perl代码在temlpate中进行排序。为此,您必须将EVAL_PERL设置为true值。然后代码看起来像这样

[% PERL %]
my $h = $stash->get('payload_batting');
my @k = sort { $h->{$a}->{AVG} <=> $h->{$b}->{AVG} } keys %$h;
$stash->set('k',\@k);
[% END %]

[% FOREACH name IN k %]
<tr>
<td width="140">[% name.substr(0,18);%]</td>
<td width="55">[% payload_batting.$name.atts %]</td>
<td width="55">[% payload_batting.$name.runs %]</td>
<td width="55">[% payload_batting.$name.hits %]</td>
<td width="55">[% payload_batting.$name.AVG %]</td>
<tr>
[% END %]

更干净的是注册一个新的自定义虚拟方法,该方法将为您进行排序(文档为here):

首先,您必须定义为您实现键排序的虚拟方法。这只是一个简单的实现,允许您在结构中按多个级别对嵌套哈希进行排序:

use Template::Stash;

$Template::Stash::HASH_OPS->{'deep_sort'} = sub {
  my ($h,$name,$op) = @_;
  $op //= 'cmp';
  my @fields = split(/\./,$name);
  my $resolve = sub {
    my $v = $_[0];
    foreach (@fields) {
      $v = $v->{$_};
    }
    return $v;
  };
  return [sort { $resolve->($h->{$a}) cmp $resolve->($h->{$b}) } keys %$h ]
    if $op eq 'cmp';
  return [sort { $resolve->($h->{$a}) <=> $resolve->($h->{$b}) } keys %$h ]
    if $op eq '<=>';
};

然后,您必须像这样在模板中引用它:

[% FOREACH name IN payload_batting.deep_sort('AVG','<=>') %]
<tr>
   <td width="140">[% name.substr(0,18);%]</td>
   <td width="55">[% payload_batting.$name.atts %]</td>
   <td width="55">[% payload_batting.$name.runs %]</td>
   <td width="55">[% payload_batting.$name.hits %]</td>
   <td width="55">[% payload_batting.$name.AVG %]</td>
<tr>
[% END %]

具有更深层数据结构的不同情况:

[%
data = {
  payload_batting => { STAT => { AVG => 4,SUM => 16 } }
}
%]

[% data.deep_sort('STAT.AVG','<=>') %]

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...