質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

perl if文 一行 実行前文のバグ??

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 635

score 11

なぜかわからないので教えてください。

仕事で古いperl スクリプトのメンテナンスを担当しているのですが、
if 文の記載の仕方で結果が異なることがありました。
文法的には正しく見えるのに。。なぜかわかる方いますでしょうか??
perl のversion は v5.8.8 です。

修正前

 my($LATMAX,$LATMIN,$LONMAX,$LONMIN)=(-90,90,-360,720);
 foreach my $f (split(',', $outstr)){
      my $file =  "$BASE_DIR/$f.cdf";
      my($lat_max,$lat_min,$lon_max,$lon_min) = &read_file( $file );
     print "lat_max,lat_min,lon_max,lon_min = $lat_max,$lat_min,$lon_max,$lon_min\n";
      $LATMAX = $lat_max if ($LATMAX < $lat_max);
      $LONMAX = $lon_max if ($LONMAX < $lon_max);
      $LATMIN = $lat_min if ($LATMIN > $lat_min);
      $LONMIN = $lon_min if ($LONMIN > $lon_mim);
}


結果
loop 1回目
lat_max,lat_min,lonmax,lonmin = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
LATMAX,LATMIN,LONMAX,LONMIN   = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
loop 2回目
lat_max,lat_min,lonmax,lonmin = 45.4778632422891,35.6423653537993,331.41255387756,324.856717470009
LATMAX,LATMIN,LONMAX,LONMIN   = 45.4778632422891,35.6423653537993,331.41255387756,324.856717470009
==>$LONMIN = $lon_min if ($LONMIN > $lon_min); が効いてない??

修正後

 my($LATMAX,$LATMIN,$LONMAX,$LONMIN)=(-90,90,-360,720);
 foreach my $f (split(',', $outstr)){
      my $file =  "$BASE_DIR/$f.cdf";
      my($lat_max,$lat_min,$lon_max,$lon_min) = &read_file( $file );
      print "lat_max,lat_min,lon_max,lon_min = $lat_max,$lat_min,$lon_max,$lon_min\n";
      if ($LATMAX < $lat_max){$LATMAX = $lat_max;}
      if ($LONMAX < $lon_max){$LONMAX = $lon_max;}
      if ($LATMIN > $lat_min){$LATMIN = $lat_min;}
      if ($LONMIN > $lon_min){$LONMIN = $lon_min;}
      print "LATMAX,LATMIN,LONMAX,LONMIN = $LATMAX,$LATMIN,$LONMAX,$LONMIN\n";
}


結果
loop 1回目
lat_max,lat_min,lonmax,lonmin = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
LATMAX,LATMIN,LONMAX,LONMIN   = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
loop 2回目
lat_max,lat_min,lonmax,lonmin = 45.4778632422891,35.6423653537993,331.41255387756,324.856717470009
LATMAX,LATMIN,LONMAX,LONMIN   = 45.4778632422891,35.6423653537993,331.41255387756,320.359240081112
if ($LONMIN > $lon_min){$LONMIN = $lon_min;} は正しい。

となりました。
文法的にはどちらも正しそうなのに、結果が変わりました。。なぜなんでしょうか?
調べてもわからなかったのでこちらで質問しました。
同じような経験がある方、どうか理由を教えていただければと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

ちょっと確実な情報ではないですが、浮動小数点精度ではないでしょうか。
プログラムで扱える小数点の最大桁数ですね。
見た目そのまま全ての桁数を扱えるわけではないので、その観点からもう少し調べてみてください。

※一応同じような経験はあるのですが、あくまでPHPとの浮動小数点桁数の精度の違いで苦労した話(しかもかなり前)なので本件の直接解決的な回答は出来ません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/06 15:29

    回答ありがとうございます。
    試しに、$lat_max,$lat_min,$lon_max,$lon_min の浮動小数点精度を.5%f にしてみましたが、結果変わらず、でした。

    キャンセル

  • 2018/12/06 15:41

    了解です。
    同じ処理内容で結果が違う場合は大体データを疑うのでその観点からの回答でした。
    お力になれず申し訳ないです

    キャンセル

+1

文法的にはどちらも正しいです。
その2つの書き方で実行結果が異なるのでしょうか?

結果についてですが、、、

if ($LONMIN > $lon_min){$LONMIN = $lon_min;}

に対して、$LONMIN=320.359240081112 と $lon_min=324.856717470009 ですよね?
結果は、$LONMIN=320.359240081112 のままで正しいように見えますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/06 15:48

    ああ、すみません。間違えました。修正前の結果が正しくないのですね。

    キャンセル

  • 2018/12/06 15:52

    修正前の方はprint文がないので、念のためその結果が出力されるprint文付きの完全なコードを載せておいた方がよいかもです。

    キャンセル

  • 2018/12/06 15:55

    ご指摘ありがとうございます。修正します。

    キャンセル

check解決した方法

0

こちらですが、、
該当箇所を抜き出し、別スクリプトでテストさせてみたところ、なんてことはなく
元スクリプトのタイプミスでした。。お騒がせいたしました。。
元スクリプトには、use strict,use warningsが付いておらず、
該当部分だけを抜き出して、use strict use warningsをつけたら試験してみたところ、
$lon_mim にエラーが出ました。
$lon_mim => $lon_min に修正したところ、正しい結果になりました。

   $LONMIN = $lon_min if ($LONMIN > $lon_min);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る