# 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);