1

我使用下面的代码对值进行排序并将其显示为 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 ;} }] 

有什么帮助吗?

4

3 回答 3

0

在排序之前对第一个元素进行切片而不是在显示之前将其放回原处,例如

my @foo = ( header, 4, 5, 6 );
$bar = shift(@foo);

# sort it or do what you want

unshift(@foo,$bar);

print @foo, "\n";
于 2017-10-19T07:54:34.777 回答
0

您可以使用“s OR t 链”中的第一个链接对值进行排序$special,例如最低值:(($b eq $special) - ($a eq $special))

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 时,将查询 s OR t 链中的下一个链接。

于 2017-10-19T08:23:03.263 回答
0

假设您的散列仅包含非负键,您可以对标头值进行排序,就好像它们是 -∞ 一样,它将在其他任何东西之前排序,但将等于自身

sort {
    my ($aa, $bb) = map { $_ eq $special ? -Inf : $_ } $a, $b;
    $aa <=> $bb and $orig->{$aa} cmp $orig->{$bb};
} keys %$orig;
于 2017-10-19T13:50:36.580 回答