おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

pregnuplot を作ってみた(2)

pregnuplot を作ってみた(2)

Perl プログラムの本体の方をここで示します。プログラムファイルは長いので、今回と次回の2回に分けて示します。インストール用のシェルスクリプトや、Texworks の設定方法は、その後に解説します。プログラムを説明しだすときりがないので、ここではとにかくプログラムファイルを示します。なお、このプログラムを使うことは自由ですが、動作について保証はしませんので、自己責任でお願いします。また、改変複写は自由です。プログラムファイル中のコメントをご覧ください。

Perl初心者の方のためのコメント

このプログラムを使うには、
 1 エディタ(leafpadなど)を開く
 2 このブラウザ画面のプログラムファイルの部分をドラッグしてコピーする
 3 エディタに貼り付ける
 4 次回「pregnuplot を作ってみた(3)」を開き、プログラムファイルの続きをコピーする
 5 エディタに続きを貼り付ける
 6 pregnuplot.pl という名前で保存する。
 7 ソースファイルを作っておく(前回「pregnuplot を作ってみた(1)」参照)
 8 端末から、「$ perl pregnuplot.pl ソースファイル名」とすれば、動くはず
以上の手順です。

プログラムファイル

注意!!プログラムが長いので、今回と次回の2回に分けます。
#!/usr/bin/perl

#
#     pregnuplot.pl
#        Texworks edition

#        version 0.60  2013/3/6(Sun)

#        著作権と補償に関するコメント
#        このプログラムがバグを含んでいないことは、保証しません。
#        このプログラムを使ったことによる被害に対して、何の補償もしません。
#        このプログラムを使うときは、使用者の自己責任でお願いします。
#        このプログラムの複写、改変、再配布は自由に行えるものとします。
#        ただし、再配布時には、この「著作権と保障に関するコメント」を削除しないこと。
#                  連絡先 Yahoo blog 「おもこん」 管理人 jeaou
#                  ブログにコメント、またはメッセージで連絡を。

#
# xy座標における関数グラフのgnuplotファイルを生成する。
#
# 概要:
#  このプログラム起動時に第1引数でソースファイルを指定する。(拡張子 .pgp)
#    例  $perl prenuplot.pl sample.pgp
#  ソースファイルには、グラフを描くための情報が書かれている。

# ソースファイルの文法
#  #以下の部分はコメントとして無視される
#  %以下の部分はコメントとして無視される
#  空行は無視される
#  「予約語 = 値」のパターンが1行に1つ現れる
#  詳しくは、default.pgp を参照

#------ 引数で指定されたファイルからの取り込み ------
# 拡張子(.pgp -- PreGnuPlot)がなければ付け足す
$pgpfile = $ARGV[0];
if ($pgpfile !~ /.pgp$/) {
  $pgpfile .= '.pgp';
} 
open(IN, $pgpfile);
while (<IN>) {
  if ($_ =~ /^\s*$/ || $_ =~ /^#/ || $_ =~ /^%/) { next; } #空行、コメント行は飛ばす
  $_ =~ s/\s*$//; #行末の改行を削除
  $_ =~ s/#.*//; #コメント記号#以降を削除
  $_ =~ s/%.*//; #コメント記号%以降を削除

#  = の左側を$keyに、右側を$valueに代入。
#  領域(DOMAIN)の記述に = が含まれるので、splitが使えない。
  $position = index($_,"=");
  $key = substr($_,0,$position);
  $value = substr($_,$position+1);

  $key =~ s/^\s*//; $key=~ s/\s*$//; #前後の空白を除去
  $value =~ s/^\s*//; $value=~ s/\s*$//; #前後の空白を除去
  $pgpdata{$key} = $value; #連想配列に追加
}
close(IN);

#累乗(^)をgnuplotの累乗(**)に置換
$pgpdata{'FX0'} =~ s/\^/**/g;
$pgpdata{'FX1'} =~ s/\^/**/g;
$pgpdata{'FX2'} =~ s/\^/**/g;
$pgpdata{'FX3'} =~ s/\^/**/g;
$pgpdata{'DOMAIN'} =~ s/\^/**/g;