CGI 基本
★Perlソフトのパスを書く
1行目にPerlソフトのパスを書く
Perlソフトがどこにインストールされているかは
プロバイダーによって異なります。
例1)
#!/www/bin/perl5
例2)
#!/usr/local/bin/perl
★ライブラリ(外部サブルーチン)の呼び出し
・ライブラリ(外部サブルーチン)の呼び出し
cgi-lib.pl や jcode.pl 等のライブラリを呼び出す
宣言をします。
・プログラム内で使用する変数に値をセットします。
例)
require './jcode.pl';
:
$title = "タイトル";
$logfile = "./log/data.log";
$cday = 365;
@weekj = ('日','月','火','水','木','金','土');
:
★引数を解釈/デコード処理
・引数を解釈
・デコード処理
例1)
$param = $ENV{'QUERY_STRING'};
例2)
if( $ENV{'REQUEST_METHOD'} ne "GET" ){
$getbuff = $ENV{'QUERY_STRING'};
($param1,$param2,$param3) = split(/&/, $getbuff);
}
例3)
&decode;
★サブルーチンへの分岐
・サブルーチンへの分岐
例1)
if ($param1 eq 'a1' ) { &syori1; }
if ($param1 eq 'a2' ) { &syori2; }
if ($param1 eq 'a3' ) {
if ($param2 eq 'b1' ) { &syori3; }else{ &syori4; }
}
★初期画面の表示(通常の処理)
・初期画面の表示(通常の処理)
[ HTMLタグで画面を作る ]
・HTML出力の宣言
・HTMLタグの出力
例1)
print "Content-type: text/html\n\n";
print <<"EOM";
<html><head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html;
charset=Shift_JIS">
<title>$title</title>
</head>
<body>
EOM
print "<font size=2>おはよう</font>\n";
print "</body></html>\n";
exit;
★パーミッションの設定①
・パーミッションの設定
CGIプログラムはサーバに転送(アップロード)後にパーミッションの設定を行う必要があります。
パーミッションとは「許可」という意味で、パーミツションの設定とは
アップロードしたファイルに対して、「読み込み」「書き込み」「実行」を
「許可する」か「許可しない」かを決めることです。
パーミッションの4桁の数字で表わすことができ、それぞれ次のようになっています。
0 7 5
1 ││││ │││└ 「他人」に対するパーミッション ││└─ 「グループ」に対するパーミッション │└── 「本人」に対するパーミッション └─── 必ず「0」
★パーミッションの設定②
パーミッション |
値 |
本人 |
読み込み可能 |
0400 |
書き込み可能 |
0200 |
実行可能 |
0100 |
グループ |
読み込み可能 |
0040 |
書き込み可能 |
0020 |
実行可能 |
0010 |
他人 (その他) |
読み込み可能 |
0004 |
書き込み可能 |
0002 |
実行可能 |
0001 |
|
上の表で「本人」「グループ」「他人」に対する値を決めて
それぞれの値を足した合計がパーミッションとなります。 |
<例> |
|
・本人が読み込み可能 |
0400 |
・本人が書き込み可能 |
0200 |
・グループが読み込み可能 |
0040 |
・他人が読み込み可能 |
0004 |
|
合計 |
0644 |
|
★画面・ファイルへのデータ出力〔print〕
print - 画面・ファイルへのデータの出力
・print ファイルハンドル "出力する内容"
ファイルハンドルあり : print HANDLE "出力内容";
ファイルに「出力内容」部分を出力します。
ファイルハンドルはopen関数でファイルを開く時に付けるファイル識別名
ファイルハンドルなし : print "出力内容";
ファイルハンドルを指定しなかった場合、「出力内容」部分は画面に表示されます。
print "どこにあらわれるかな?";
とすると
ブラウザに「どこにあらわれるかな?」と表示されます。
長い文字列を出力したい場合
print <<MOJI;
長~い文字列
MOJI
とすると
「 <<MOJI 」と「 MOJI 」にはさまれた全ての文字が出力されます。
MOJI の部分は自分の好きな文字を指定します。
但し、日本語で指定する場合はダブルクォーテーションで囲みます。
print <<"かきかき";
出力内容
かきかき
注意) 「 <<MOJI 」と「 MOJI 」ではさむとき、最後の文字「 MOJI 」にタブやスペースを付け
ないようにします。通常タブやスペースは無視されますが、この場合は例外です。
★日付、時間、曜日の取得〔time , localtime〕
time - 時間を取得する
localtime - ローカル時間に変換する
・time()
・localtime()
$MyTime = localtime(time());
$MyTime には
「秒」「分」「時」「日」「月」「年」「曜日」「元旦からの日数」「サマータイムの有無」の順に
セットされます。
「曜日」は 0~6 の数字
「サマータイムの有無」は サマータイム無しの時 0 、有りのとき正の数字
曜日を日本語にしたい場合
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$sm) =localtime(time());
@youbi = ('日','月','火','水','木','金','土');
$youbi[$wday]
とします。
★ファイルの操作1〔open, close〕
open - ファイルを開く
close - ファイルを閉じる
・open( ファイルハンドル, "ファイル名")
・close( ファイルハンドル)
open( IN, "logdata.txt");
@lines = <IN>;
close(IN);
としたとき
ファイルハンドル・・・ IN
ファイル名・・・・・・・・ logdata.txt
open関数はファイルを使用する目的に応じてファイル名の前に符号を付加します。
・読込目的 ------- "<ファイル名" または "ファイル名"
・書込目的 ------- ">ファイル名"
・追加書込目的 --- ">>ファイル名"
open( OUT, "logdata.txt");
print OUT "追加する文字列";
close(OUT);
注意) Perl言語では作業が終了すると自動的にファイルは閉じられますが、
close関数はopen関数と一対で使用しましょう。
★ファイルの操作1〔flock〕
flock - ファイルをロックする
・flock( ファイルハンドル, ロックの方法)
flock( OUT, 2);
ファイルへの処理
flock( OUT, 8);
ロックの方法は
・ファイルを共有する (同時に書き込み可) --- 1
・ファイルを共有しない(同時に読込・書込不可) --- 2
・ファイルのロックを解除する --- 8
注意1) 「flock()」関数はUNIX系OS上でしか動作しないため、Windows上で
実行するとエラーになります。
回避方法として
① 自分のパソコンで動作チェックするときはコメントにしておき
サーバにアップするときにコメントをはずします。
コメントは行の先頭に # を付けます
# flock(OUT, 2);
ファイルへの処理
# flock(OUT, 8);
② eval を使って使用不可の場合、無視させます。
eval {flock( OUT, 2 );};
ファイルへの処理
eval {flock( IN, 8 );};
注意2) ファイルへのアクセスが多い場合、「flock()」関数だけでは完全とはいえません。
この場合は open関数を使った次のロック方式を使ってください。
$logfile = "logdata.txt";
$lockfile = "./lockchk.lock";
:
&lock1; # lock1 のサブルーチンへ飛ぶ
open(IN,"$logfile") || &error("Open Error : $logfile","lock");
eval {flock( OUT, 2 );};
ファイルへの処理
eval {flock( IN, 8 );};
close(IN);
if (-e $lockfile) { unlink($lockfile); } # ファイルのロック解除 $lockfileを削除
:
exit;
sub lock1 { # ファイルのロック $lockfileを作成
local($flag) = 0;
foreach (1 .. 5) {
if (-e $lockfile) {
# $lockfileが存在したらちょっと待つ
sleep(1);
}else{
# $lockfileが存在しなかったら$lockfileを新たに作成する
open(LOCK,">$lockfile")
|| &error("Write Error : $lockfile","lock");
close(LOCK);
$flag = 1;
last;
}
}
# $flag が 0 のときは他のユーザが使っているのでメッセージを出力する
if ($flag == 0) { &error("LOCK
is BUSY","lock"); }
}
sub error {
if ($_[1] eq "lock" && -e $lockfile) { unlink($lockfile);
}
if ($HEAD eq "") { &header; }
print "<center><hr width='75%'><P>ERROR
!\n";
print "<P><font color=red><B>$_[0]</B></font>\n";
print "<P><hr width='75%'></center>\n";
print "</body></html>\n";
exit;
}
★配列の操作〔push, pop〕
push - 配列の最後に要素を追加する
pop - 配列の最後の要素を削除する
・push( 配列名 , 追加する要素 )
・pop( 配列名 )
@data = ( 1, 2, 3, 4 );
push( @data , 5 );
これを実行すると
配列 @data の内容は ( 1, 2, 3, 4 ) から ( 1, 2, 3, 4, 5 ) になります。
一度に複数要素を追加したいときは
push( @data , 5 , 6 , 7 );
とします。
配列 @data の内容は ( 1, 2, 3, 4 ) から ( 1, 2, 3, 4, 5, 6, 7 ) になります。
@data = ( 1, 2, 3, 4 );
pop( @data );
これを実行すると
配列 @data の内容は ( 1, 2, 3, 4 ) から ( 1, 2, 3 ) になります。
★配列の操作〔unshift, shift〕
unshift - 配列の最初に要素を追加する
shift -配列の最初の要素を削除する
・unshift( 配列名 , 追加する要素 )
・shift( 配列名 )
@data = ( 1, 2, 3, 4 );
unshift( @data , 5 );
これを実行すると
配列 @data の内容は ( 1, 2, 3, 4 ) から ( 5, 1, 2, 3, 4 ) になります。
@data = ( 1, 2, 3, 4 );
shift( @data );
これを実行すると
配列 @data の内容は ( 1, 2, 3, 4 ) から ( 2, 3, 4 ) になります。
★配列の操作〔reverse〕
reverse -配列の要素を逆にする
・reverse( 配列名 )
@data = ( 1, 2, 3, 4 );
@data_r = reverse( @data );
これを実行すると
配列 @data の内容は ( 1, 2, 3, 4 ) から ( 4, 3, 2, 1 )となり、配列 @data_r に
格納されます。
★文字列操作1〔split〕
split - 文字列を分割する
・split( /区切り文字/, 分割する元の文字列, 分割する数 )
$data = " 1<> 匿名<> 2001/01/01<> 12:00<>
abc@xyz.co.jp<> こんにちは";
@list = split( /<>/, $data );
とすると配列 @list には
$list[0] = "1" $list[1] = "匿名" $list[2]
= "2001/01/01"
$list[3] = "12:00" $list[4] = "abc@xyz.co.jp"
$list[5] = "こんにちは"
と分割されます。
@list = split( /<>/, $data , 3);
とすると配列 @list は
$list[0] = "1" $list[1] = "匿名"
$list[2] = "2001/01/01<> 12:00<> abc@xyz.co.jp<>
こんにちは"
と分割されます。(3つ目はひとまとめになります。)
注意) 「区切り文字」が「,」の場合は「split( /,/, $data )」、改行で区切る場合は「split( /\n/, $data )」
「/」を区切り文字とした場合は「split( ///, $data )」とせず、エスケープシーケンスを使って
「split( /\//, $data )」と書きます。
区切り文字なしで「split( //, $data )」と書くと、文字列の前から1文字ずつ順番に分割してくれ
ます。
★文字列操作1〔sprintf〕
sprintf - 文字列や数値をフォーマットにあわせて変更する
・変数名 = sprintf( "フォーマット", 文字列または数値 )
$data = sprintf( "%05d", 123 );
とするとスカラー変数 $data は
$data = 00123
と5桁の数値に変換されセットされます。
よく使うフォーマット書式と意味
書式 |
意 味 |
使い方 |
%c |
文字 |
sprintf( "答え=%c", $dat ); |
%d |
10進数 |
sprintf( "%05d", 123 ); |
%ld |
10進数(long) |
sprintf( "%+.2ld", $dat ); |
%u |
符号なし10進数 |
sprintf( "%05u", $dat ); |
%lu |
符号なし10進数(long) |
sprintf( "%lu", $dat ); |
%o |
8進数 |
sprintf( "%04o", $dat ); |
%x |
16進数 |
sprintf( "%#04x", $dat ); |
%s |
文字列 |
sprintf( "%s", $dat ); |
書式の % と 英数字の間に付加する文字と意味
文字 |
意 味 |
+ |
正の値のとき「+」を付ける |
- |
左揃えにする |
0 |
右揃えにするために「0」を付ける |
スペース |
右揃えにするために「スペース」を付ける |
数値 |
正の整数の桁数 |
.数値 |
小数点以下の桁数 |
# |
8進数のときは「0」、16進数のときは「0x」を付ける |
★文字列操作1〔substr〕
substr - 文字列の一部分を取り出す
・変数名 = substr( 元の文字列, 開始位置, 長さ )
$data = substr( "ABCDEFGHIJK", 4, 4);
とするとスカラー変数 $data は
$data = "EFGH"
となります。
$data = substr( "いろはにほへと", 4, 4);
と全角文字が元の文字列の場合、1文字を2文字として計算するので
$data = "はに"
の結果になります。
substr関数を使って文字列の置き換えもできます。
$data = "ただいま準備中です";
substr( $data, 8, 4) = "営業";
これでスカラー変数 $data の 「準備」が「営業」に置き換えられて
$data = "ただいま営業中です"
となります。
★ファイルの操作2〔unlink, rename〕
unlink - ファイルを削除する
rename - ファイルの名前を変更する
・unlink("削除するファイル名")
unlink("logdata.txt");
とすると、「logdata.txt」ファイルは削除されます。
複数のファイル(「test1.txt」「test2.txt」「test3.txt」)をまとめて削除したいときは
unlink("test1.txt","test2.txt","test3.txt");
とカンマで区切って指定します。
・rename("元のファイル名","新しいファイル名")
abc.txtをxyz,txtに名称変更したい場合
rename("abc.txt","xyz.txt");
とします。
★フォルダ(ディレクトリ)の操作〔mkdir, rmdir, chdir〕
mkdir - 新しいフォルダを作成する
・mkdir("新しく作るディレクトリ名",パーミッション)
mkdir("newdir",0777);
とすると、cgiプログラムが存在するフォルダの下に新しいフォルダ「newdir」が作成されます。
この指定ではパーミッションを「0777」にしているので、「newdir」は「本人」「グループ」「その他」全て
に対して、読み込み可能、書き込み可能、実行可能なフォルダとして作成されます。
パーミッションについては「 パーミッションの設定」を参照してください。
★フォルダ(ディレクトリ)の操作〔rmdir〕
rmdir - フォルダを削除する
・rmdir("削除するディレクトリ名")
フォルダ(ディレクトリ)を削除するときは
rmdir("newdir");
とすると削除できます。
但し、削除するフォルダは空にしておく必要があります。フォルダ「newdir」の中にファイルや別のフォルダが
ある場合は削除できません。
★フォルダ(ディレクトリ)の操作〔chdir〕
chdir - 作業するフォルダを変更する
・chdir("作業するディレクトリ名")
新しく作ったフォルダ「newdir1」の下に別のフォルダ「newdir2」を作るときは
mkdir("newdir1",0777);
chdir("newdir1");
mkdir("newdir2",0777);
とします。
|
|
Copyright © Since 2008 Exterior taiyu All rights reserved |
|