[英]Sort a hash reference by value instead of key in Template Toolkit
我有一個 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 代碼進行排序。 為此,您必須將 EVAL_PERL 設置為真值。 然后代碼看起來像這樣
[% 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 %]
更簡潔的是注冊一個新的自定義虛擬方法,它可以為您進行排序(文檔在這里):
首先,您必須定義為您實現鍵排序的虛擬方法。 這只是一個簡單的實現,允許您按結構中的多個級別對嵌套散列進行排序:
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','<=>') %]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.