指定したy値を与えるx値を求めファイルにセーブする

 カレントframeに読み込まれている全ての数値データに対し、ユーザが与えたy値を与えるようなx値をデータ点の補間により求め、その結果をファイルに書き出します。ここではファイルへの書き込み方法について学びます。


  # CUI関数'edittext'により、ユーザがy値の入力を行います。入力
  # がキャンセルされるとスクリプトは終了します。

  if (!edittext(0, 'input y-value'))
  {
      print "canceled\n";
      exit(1);
  }
  
  # ファイルに書き込む内容を保持する変数$resultsをnull文字に初期化
  # します

  $results = '';

  # ユーザの入力値は$_RETに返されますので、$yvalに格納します。
  
  $yval = $_RET;

  # 読み込まれているデータファイル数を$lengthに代入します。

  $length = $graph->frame[$_CUR]->length('data');

  # 各データファイルに関し処理を行います。
  
  for ($i = 0; $i < $length; $i++)
  {

     # データ点数を取得し$pointnoに格納します。

     $pointno = $graph->frame[$_CUR]->data[$i]->datalength();

     # 各データ点に関し処理を行います。     
     for ($j = 0; $j < $pointno - 1; $j++)
     {
       $y1  = $graph->frame[$_CUR]->data[$i]->Y[$j];
       $dy1 = $y1 - $yval;
       $y2  = $graph->frame[$_CUR]->data[$i]->Y[$j + 1];
       $dy2 = $y2 - $yval;

       # $dy1 * $dy2 <= 0 であればこの2点間でユーザが与えた
       # y値をデータが横切ったと判断します。

       if ($dy1 * $dy2 <= 0)
       {

          # この時のx値を直線補間で求めます。

          $x1 = $graph->frame[$_CUR]->data[$i]->X[$j];
          $x2 = $graph->frame[$_CUR]->data[$i]->X[$j + 1];
          $x = ($yval - $y1) / ($y2 - $y1) * ($x2 - $x1) + $x1;

          # 結果を、"ファイル名 \t x値 \n"の形式で$resultsに追加します。
          # ピリオドは文字列の連結を行うオペレータであることに注意します。

          $results .= $graph->frame[$_CUR]->data[$i]->filename . "\t" . $x . "\n";
          break;
       }
     }
  }

  # CUI関数'editfilename'により、ユーザが結果を保管するファイル名を入力
  # します。

  if (!editfilename('', 'save filename'))
  {
      print "canceled\n";
      exit(1);
  }
   
  $outfile = $_RET;

  # 書き込みモードでファイルをオープンし、ファイルハンドルOUTFに対応
  # させます。

  open(OUTF, ">$outfile");

  # ファイルハンドルOUTFに結果を書き込みます。

  print OUTF $results; 

  # ファイルハンドルOUTFをクローズします。

  close (OUTF);