2016-04-05 7 views
0

ソートが最小値を選択しているperlコードを持っていますが、1つの値が0の場合は無視してください。 これはフィルタリングなしで機能をソートされます。Perlはゼロをフィルタリングして最小値を並べ替えます

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[$n]=desc_Emin($descs_a[$n],$descs_b[$n],$descs_c[$n]); 

は、リストがあります$ 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

をあなたが使用する必要があります何かを見つける必要がある場合には、 'grepを/マップ/ –

+0

@ OlegV.Volkovしかし、私は数値を持っているので、なぜgrepとmapを使うべきですか? '$ descs _a [1] 'は既に '1'であり、' $ descs_c [1] 'は '0'です。コードは私によって書かれていません - 私はそれを使用して、このバグを修正しようとしています。 – XuMuK

+0

私はあなたの質問を得ることはありません。あなたは何とか 'grep'が文字列のためだと思っていますか?いいえ、そうではありません。 –

答えて

2

あなたは必要。、すべての値をオーバースキャン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

これは私が探していたものです。 – XuMuK