【发布时间】:2016-07-25 08:26:07
【问题描述】:
我有 perl 代码,其中排序选择最小值,但如果一个值为 0,则应忽略它。 这是没有过滤的排序功能:
sub desc_Emin
{
my($emin)=(sort{$b<=>$a} @_)[-1];
return $emin;
}
这个函数被调用并取值:
$desc_mv[$n]=desc_Emin($descs_a[$n],$descs_b[$n],$descs_c[$n]);
比如有一个列表:
descs_a descs_b descs_c
1 4 5
0 1 3
0 0 0
2 2 0
排序后 [$desc_mv] 应该是:
1
1
0
2
如何在不添加大量“if”语句的情况下进行过滤?最好在 "$desc_mv[$n]=desc_Emin(..." 部分过滤零?
我的快速时间解决方案如下所示:
if($descs_a[$n] == $descs_b[$n] and $descs_b[$n] == $descs_c[$n] ){
$desc_mv[$n]=$descs_a[$n];
}
else{
use Switch;
switch($descs_a[$n]){
case 0 {$descs_a[$n] = 99999999999999};
}
use Switch;
switch($descs_b[$n]){
case 0 {$descs_b[$n] = 99999999999999};
}
use Switch;
switch($descs_c[$n]){
case 0 {$descs_c[$n] = 99999999999999};
}
$desc_mv[$n]=desc_Emin($descs_a[$n],$descs_b[$n],$descs_c[$n]);
}
【问题讨论】:
-
当你需要找东西时,你应该使用
grep/map/for,而不是sort。 -
@OlegV.Volkov 但是我有数值,为什么要使用 grep 和 map?
$descs_a[1]已经是1并且$descs_c[1]是0。代码不是我写的——我正在使用它并试图修复这个错误。 -
我不明白你的问题。您是否以某种方式认为
grep用于字符串?不,不是。 -
@OlegV.Volkov 是的,这是我第一次真正编辑 perl 脚本。
标签: arrays perl sorting filtering