[ ホーム | 本の感想 | 好きな作家 | イラスト展示 | Perlは便利 | Javaプログラミング ]

1. Perlは便利 第1回



Perl はインタプリタ型のプログラミング言語です。UNIX のツールとして開発され、インターネットの CGIスクリプトにも使われます。パールと読みます。

CGI は Common Gateway Interface の略で、WWWサーバとプログラム間で、情報のやり取りをするための仕組みです。ウェブ・ブラウザから WWWサーバの特定のプログラムを起動して、結果をウェブ・ブラウザに返します。CGI を処理するプログラミング言語は、WWWサーバで動作して標準入力、標準出力、環境変数の参照が出来れば、何でもいいようです。

インターネットで CGI として使う場合は、プロバイダーのサーバ上の Perl でプログラムが実行されるので、サーバに対する知識やネットワークに関する知識が要求されます。実際の CGI なども、HTML文と混ざり合った記述の仕方をしてあったり、何か大変そうです。また、プロバイダーの許可が必要とか、セキュリティーを考慮したりとか、いろいろめんどくさいので、しばらくは Perl の勉強期間と思って CGI に関係のない物を作っています。


現在使っているのは、Win95/NT移植版の jperl4 で、perl のバージョン 4 を日本語化したものです。perl のバージョン 5 が存在するので、jperl5 もあるかも知れません。
Perl の文法は、少し C言語に似ていますが、かなり特殊な記述も出来て、特殊な記述を使うのは始めのうち抵抗がありましたが、慣れると便利です。

例を上げると、
	$fname = "file.java";
	open(FL, "<$fname"); 	# 入力用ファイル
	$lno = 1;
	while(<FL>) {
		printf("%3d:%s",$lno++,$_);
	}
	close(FL);
$fname = "file.java"; で変数に file.java という文字列を入れて、open(FL, "<$fname");でファイルを入力用にオープンしています。FL がファイルハンドルで、< が入力用の意味。
$lno = 1; で変数 $lno を 1 にしています。文字列も数値も変数はみな $ で始まります。
while(<FL>) { でファイルハンドルFL から1行ずつ読み込み、それは、$_ というシステムの用意した変数に入ります。ファイルの終わりまでの読み込みを繰り返します。
printf("%3d:%s",$lno++,$_); は出力、C の printf と大差ありません、%3d で3桁の数値、これは $lno を出力します。次に : を出力し、%s は文字列なので、ファイルから読み込んだばかりの1行 $_ が出力されます。
$lno に付いている ++ は C と同じで インクリメントの意味です。$lno に 1 を足します。
close(FL); は当然、ファイルのクローズ。
これで file.java の内容に行ナンバーが付いて出力されます。

実際このプログラムに少し手を入れて Java のページを書くときにも使いました。

# テキストに行番号をつけて出力する
# ntype2.pl の変更版	'98/07 Hirose

	if ($#ARGV == 0) {
		$fname = $ARGV[0];
	} else {
		printf "Input File name:";
	    input:
		while(($c = getc) ne '') {
			if ($c eq "\n") { last input;}
			$fname .= $c;
		}
		printf "\n";
	}

	open(FL, "<$fname"); # 入力用ファイル
	$lno = 1;
	while(<FL>) {
		printf("%3d:%s",$lno++,$_);
	}
	close(FL);




Perl を少し使った後、Java に関心が移ってしまって、今ではかなり忘れてしまったのです。
Java のページのように何か書きたいと思っても書けないので、簡単なプログラムを紹介します。

ファイル PON9811.DAT, PON9812.DAT などに、年月日と時間を書き込むプログラムです。
これを実行するバッチファイルを Windows のスタートアップに入れておくと、毎日の始動時間が記録されます。会社で出社と同時にパソコンの電源を入れるという人は自分の出社時間が記録できて便利かと思います。

# PON9806.DATなどのファイルに現在時間(起動時間)を書き込む
# printf の %02 使用に変更              '98/06  Hirose
# ファイル名に年数追加                  '98/12

	$drv = "C:";                    # ドライブ
	$dir = "\\perl4\\poweron";      # ディレクトリ

	%w = ("0","日","1","月", "2","火", "3","水", "4","木", "5","金", "6","土", );

	# 現在時間を取得する。
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

	++$mon;
	$mon = substr("0$mon", -2, 2);	# $mon が '6' なら '06' にする
	$year = substr("0$year", -2, 2); 

	$fname = "$drv$dir\\PON$year$mon.DAT";
	open(FL,">>$fname");  
	$wd = $w{$wday};
	printf (FL "19%02d 年 %02d 月 %02d 日 (%s)  %02d 時 %02d 分\n", $year
                                                                      , $mon
                                                                      , $mday
                                                                      , $wd
                                                                      , $hour
                                                                      , $min );
	close(FL);


ですが、これだと1日に何回も立ち上げをすると、それが全て記録されてしまいます。1日に1回だけ記録するように変更したプログラムも作りました。

# PON9806.DATなどのファイルに現在時間(起動時間)を書き込む
# printf の %02 使用に変更              '98/06  Hirose
# 1日に1回しか書き込まないように変更
# 西暦2000も考慮                        '98/10
# ファイル名に年数追加                  '98/12

	$drv = "C:";                    # ドライブ
	$dir = "\\perl4\\poweron";      # ディレクトリ

	%w = ("0","日","1","月", "2","火", "3","水", "4","木", "5","金", "6","土", );

	# 現在時間を取得する。
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

	++$mon;
	$mon = substr("0$mon", -2, 2);          # $mon が '6' なら '06' にする
	$year = substr("0$year", -2, 2);
	$wd = $w{$wday};                        # 漢字の曜日

	if ($year >= 90) {
		$y100=19;
	} else {
		$y100=20;
	}

	$today = sprintf ("%2d%02d 年 %02d 月 %02d 日 (%s)", $y100
                                                           , $year
                                                           , $mon
                                                           , $mday
                                                           , $wd );

	$fname = "$drv$dir\\PON$year$mon.DAT";

	# 読み込んで、一番最後の行のデータを取り出して
	open(FL, $fname);
		while(<FL>){
			$tmp = $_;
		}
	close(FL);

	# 文字列の前半(日付部分)だけを比較する
	if ($today eq substr($tmp, 0, length($today))) {
		# 同じなら書かない
	} else {
		#print "tigau !!!\n";
		open(FL,">>$fname");  
		printf (FL "%2d%02d 年 %02d 月 %02d 日 (%s)  %02d 時 %02d 分\n", $y100
                                                                               , $year
                                                                               , $mon
                                                                               , $mday
                                                                               , $wd
                                                                               , $hour
                                                                               , $min );
		close(FL);
	}


とりあえず、こんなところで。



[ ホーム | 本の感想 | 好きな作家 | イラスト展示 | Perlは便利 | Javaプログラミング ]
間違いなどお気付きの事がありましたら hirose97@max.hi-ho.ne.jp までメールを下さい。
ご感想もお待ちしています。なお、リンクは自由ですが出来ればお知らせ下さい。