Как отображать специальное значение всегда сверху при сортировке?

Я использовал приведенный ниже код для сортировки значений и отображения его в виде раскрывающегося списка на странице формы 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";
Другие вопросы по тегам