Arrays Perl使用过滤零对最小值进行排序

Arrays Perl使用过滤零对最小值进行排序,arrays,perl,sorting,filtering,Arrays,Perl,Sorting,Filtering,我有一段perl代码,其中排序选择最小值,但如果一个值为0,则应该忽略它。 这是无过滤的排序功能: sub desc_Emin { my($emin)=(sort{$b<=>$a} @_)[-1]; return $emin; } 例如,有以下列表: descs_a descs_b descs_c 1 4 5 0 1 3 0 0 0 2 2 0 排序后,[$de

我有一段perl代码,其中排序选择最小值,但如果一个值为0,则应该忽略它。 这是无过滤的排序功能:

sub desc_Emin
{
 my($emin)=(sort{$b<=>$a} @_)[-1];
 return $emin;
}
例如,有以下列表:

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]);
            }

您的操作过于复杂。您需要扫描所有值,跳过0并记住每个新值(如果它小于以前记住的值)。只需用Perl准确地写出即可:

sub desc_Emin {
    my $min = 0;
    for my $val (@_) {
        # if we're remembering 0, replace it with anything OR (if new value is not 0 and smaller than what we remember, remember that)
        if ($min == 0 || ($val != 0 && $min > $val)) { $min = $val }
    }
    return $min;
}

您的操作过于复杂。您需要扫描所有值,跳过0并记住每个新值(如果它小于以前记住的值)。只需用Perl准确地写出即可:

sub desc_Emin {
    my $min = 0;
    for my $val (@_) {
        # if we're remembering 0, replace it with anything OR (if new value is not 0 and smaller than what we remember, remember that)
        if ($min == 0 || ($val != 0 && $min > $val)) { $min = $val }
    }
    return $min;
}

当您需要查找某些内容时,您应该使用
grep/map/for
,而不是
sort
@OlegV.Volkov,但我有数值,为什么要使用grep和map?
$descs_a[1]
已经
1
$descs_c[1]
0
。代码不是我写的-我正在使用它并试图修复这个错误。我不明白你的问题。你是否认为
grep
是字符串?不,不是。@OlegV.Volkov是的,这是我第一次真正编辑perl脚本。当你需要找到什么东西时,你应该使用
grep/map/for
,不是
sort
@OlegV.Volkov,但我有数值,为什么我应该使用grep和map?
$descs\u a[1]
已经是
1
$descs\u c[1]
0
。代码不是我写的-我正在使用它并试图修复此错误。我不明白你的问题。你是否认为
grep
是字符串?不,不是。@OlegV.Volkov是的,这是我第一次真正编辑perl脚本。这正是我一直在寻找的。这正是我一直在寻找的。