Как отображать специальное значение всегда сверху при сортировке?
Я использовал приведенный ниже код для сортировки значений и отображения его в виде раскрывающегося списка на странице формы Perl. И мне нужно всегда отображать определенное значение в верхней части отсортированного списка, как это сделать?
values= [sort {$a<=>$b and $orig->{$a} cmp $orig->{$b}} keys %$orig]
Я тоже это пробовал, по какой-то причине со мной не работает
values= [sort {if ($a eq 'somevalue') { return 1; }
elsif ($b eq 'somevalue') { return -1; }
else { return {$a<=>$b and $orig->{$a} cmp $orig->{$b}} keys %$orig ;} }]
Любая помощь?
3 ответа
Вы можете отсортировать $special
значение как самое низкое использование (($b eq $special) - ($a eq $special))
как первое звено в "sOR t chain":
my $special = "somevalue";
sort { (($b eq $special) - ($a eq $special)) ||
$a<=>$b || $orig->{$a} cmp $orig->{$b} } keys %$orig;
(($b eq $special) - ($a eq $special))
возвращает:0
когда $ a и $ b особенные [$ a равно $ b]-1
когда $ a особенный, а $ b не [$ a меньше, чем $ b]+1
когда $ b особенный и $ a не [$ a больше, чем $ b]0
когда и $ a, и $ b не являются специальными [$ a равно $ b]
Когда он выдает 0, запрашиваются следующие ссылки в цепочке sOR t.
Предполагая, что ваш хеш содержит только неотрицательные ключи, вы можете отсортировать значения заголовков, как если бы они были -∞, которые будут сортировать перед чем-либо еще, но будут равны себе
sort {
my ($aa, $bb) = map { $_ eq $special ? -Inf : $_ } $a, $b;
$aa <=> $bb and $orig->{$aa} cmp $orig->{$bb};
} keys %$orig;
Отрежьте 1-й элемент перед сортировкой, затем верните его перед отображением, как
my @foo = ( header, 4, 5, 6 );
$bar = shift(@foo);
# sort it or do what you want
unshift(@foo,$bar);
print @foo, "\n";