SAK 図書館
CGI-Perl 基礎実地編 - 実習12 (標準ファイル入出力)
■test12.cgi
------ ↓ ここから ↓ ------
#!/usr/local/bin/perl
#// 準備
$fname = 'test.txt';
$cufld = '.';
$dbfld = '/w_test/';
$path = $ENV{'PATH_INFO'};
#// 動作環境セット
if (($i = index($path, $dbfld)) != -1) {
$cufld = '..' . substr($path, $i, $i + length($dbfld) - 1);
}
#// ファイル書き込み
open(FILE, ">$cufld/$fname") or die;
print FILE 'やっほ〜。', "\n";
print FILE 'うまくライトできるかしらん。(^^)', "\n";
close(FILE);
#// ファイル読み込み
open(FILE, "$cufld/$fname") or die;
@rec = <FILE>;
close(FILE);
#// HTML ヘッド出力
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<P>-- 標準ファイル入出力テスト --</P>\n";
#// レコード表示
foreach (@rec) {
print $_, '<BR>';
}
#// HTML テイル出力
print "</HTML>\n";
#// 終了
exit(0);
------ ↑ ここまで ↑ ------
■解説
・この test12.cgi は、test.txt に書き込んだデータを読み込んで、
ブラウザに表示します。
$dbfld = '/w_test/';
|_ PWS など、実行 cgi の場所がカレントとならないような環境
での動作環境設定に使用するテストフォルダ名
$cufld = '..' . substr($path, $i, $i + length($dbfld) - 1);
|_ PWS イントラネット環境では、常に cgi-bin がカレントと
なってしまうので、/w_test/test12.cgi のロケーションの
場合、/w_test/ がパスに含まれていれば、PWS 用の環境を
セットする。
この場合、'../w_test' が $cufld にセットされる。
open(FILE, ">$cufld/$fname") or die;
| | || |_ オープンエラー時処理中止
| | ||_ パス/ファイル
| | | test12.cgi と同じフォルダの test.txt となる
| | |_ 上書き出力モード
| |_ ファイルハンドル
|_ ファイルオープン関数
print FILE 'やっほ〜。', "\n";
| |_ 出力リテラル
|_ 出力ファイルハンドル
close(FILE);
| |_ ファイルハンドル
|_ ファイルクローズ関数
open(FILE, "$cufld/$fname") or die;
| | | |_ オープンエラー時処理中止
| | |_ パス/ファイル (読み込みモード)
| |_ ファイルハンドル
|_ ファイルオープン関数
@rec = <FILE>;
| |_ ファイルハンドルが示す入力から読み込む
|_ 改行コードで配列変数 @rec に全レコードをセット
@rec[0] などの各レコードの末尾には "\n" が含まれているので注意!!
■補足
・実際には、ファイル出力はマルチユーザを考慮したければならない。
同時に同一ファイルに複数のユーザがアクセスしたとき、書き込みモードは
ファイルを破壊する可能性がある。
ファイルロックなど、必要な手段を講じること。
但し、不用意なファイルロックは、無限ループやアクセス不能をまねく。
できるだけ排他制御の少ない仕様を検討した方が良い。
■実地
・test12.cgi も実際に作成してテストしてみましょう。
・尚、イントラ環境など、ローカルのカレント環境がわからない場合は、
次の実地13 にある test13.cgi でカレント環境を調査して下さい。
通常の UNIX CGI-Server なら、test12.cgi を無修正で実行できると
思います。
■CGI-Perl 基礎実地編資料
■CGI-Perl 基礎編資料
■CGI-Perl 応用実地編資料
■PHP 基礎編資料
■PHP + MySQL 編資料