2016-04-05 7 views
0

Ich habe den Perl-Code, wo Sortierung den minimalen Wert wählt, aber wenn der eine Wert 0 ist, sollte es ignoriert werden. Diese Funktion ohne Filterung Sortierung:Perl, das minimale Werte mit filternden Nullen sortiert

sub desc_Emin 
{ 
my($emin)=(sort{$b<=>$a} @_)[-1]; 
return $emin; 
} 

Und diese Funktion aufgerufen wird und nehmen Werte:

$desc_mv[$n]=desc_Emin($descs_a[$n],$descs_b[$n],$descs_c[$n]); 

Zum Beispiel gibt es die Liste:

descs_a descs_b descs_c 
1  4  5 
0  1  3 
0  0  0 
2  2  0 

Nachdem es sorting [ $ desc_mv] sollte sein:

1 
1 
0 
2 

Wie filtern, ohne eine Menge 'if' Anweisungen hinzuzufügen? Es ist besser, filtern Nullen in der "$ desc_mv [$ n] = desc_Emin (..." Teil

Meine schnelle zeitliche Lösung sieht so aus:?.

  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

wenn Sie etwas finden müssen, sollten Sie 'grep/Karte verwenden/for', not 'sort'. –

+0

@ OlegV.Volkov Aber ich habe numerische Werte, warum sollte ich Grep und Karte verwenden?' $ descs _a [1] 'ist bereits' 1' und '$ descs_c [1]' ist '0'. Der Code wurde nicht von mir geschrieben - ich benutze ihn und versuche diesen Fehler zu beheben. – XuMuK

+0

Ich bekomme deine Frage nicht. Denkst du irgendwie, 'Grep' ist für Streicher? Nein, ist es nicht. –

Antwort

2

Sie overcomplicating Sachen, die Sie brauchen . alle Werte abtastet, überspringen 0 und jeden neuen Wert erinnern, wenn sie kleiner als zuvor erinnerten ist nur, dass genau, in Perl schreiben:

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

Genau das habe ich gesucht. – XuMuK