Arrays Perl使用过滤零对最小值进行排序
我有一段perl代码,其中排序选择最小值,但如果一个值为0,则应该忽略它。 这是无过滤的排序功能: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
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脚本。这正是我一直在寻找的。这正是我一直在寻找的。