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 編資料