Perlプログラムをするときのノウハウ集です。
perlで、プログラムやコマンドを起動する方法には、いろいろな方法があります。
system("command param");
|
exec("command param");
|
`command param` |
パイプを使用して、出力したデータをJISコードに変換する例です。 open時のファイル名の前に"|"記号を記述します。
$command = "nkf -j"; open(STDOUT,"| $command"); print "テキスト\n"; close(STDOUT); |
perlはインタープリタなので、動的に関数を呼び出すことができます。
この機能を使うと、ソース修正をしなくても機能拡張を行うことができます。
ただし、実行速度が少し遅くなります。
exec_func関数は、関数名と関数パラメータを入力すると、指定した関数を呼び出す関数です。
eval関数で評価することにより、関数が実行されます。
#!/usr/local/bin/perl
# 動的な関数の呼び出し
# func_aの呼び出し
$func_name = 'func_a';
$func_parm = 'parm_a';
&exec_func($func_name, $func_parm);
# func_bの呼び出し
$func_name = 'func_b';
$func_parm = 'parm_b';
&exec_func($func_name, $func_parm);
# 動的な関数の呼び出し関数
sub exec_func {
my ($func_name, $func_parm) = @_;
eval "\&$func_name(q/$func_parm/)";
}
# テスト用関数
sub func_a {
my ($parm) = @_;
printf("func_a(%s)\n", $parm);
}
sub func_b {
my ($parm) = @_;
printf("func_b(%s)\n", $parm);
}
|
起動方法が、GET の場合と POST の場合で、CGI へのパラメータの渡し方が、変わります。 起動方法が、GET か POST かは、環境変数 REQUEST_METHOD を参照することで判断できます。
GET の場合 引数は ARG で渡されます。 環境変数 QUERY_STRING にもセットされます。 参照方法 シェル $#, $* ($1, $2, ...) C 言語 argc, argv POST の場合 引数は標準入力で渡されます。 引数のバイト数は,環境変数 CONTENT_LENGTH にセットされます。 参照方法 シェル read C 言語 gets() |
CGIのパラメータは、URLエンコードされています。
ですから、特殊な文字や漢字は %xx (xxは16進数) となっています。
また、CGIの各パラメータの区切りは '&' で、' '(スペース) は '+' になっています。
# '&' で値を分離
foreach (split(/&/, $str)) {
# '+' を スペースに変換
tr/+/ /;
# 改行データの統一(\n)
s/\r\n/\n/go;
s/\r/\n/go;
# 名前(key)と、値(val)に分離
($key, $val) = split(/=/);
# 16進文字列(%XX) から 文字へ変換
$key =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/ego;
$val =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/ego;
# 値の前後に空白がある場合、削除
$key =~ s/^\s+//o;
$key =~ s/\s+$//o;
$val =~ s/^\s+//o;
$val =~ s/\s+$//o;
# FORM変数に格納
if (defined($FORM{$key})) {
$FORM{$key} = "\0";
}
$FORM{$key} .= $val;
}
|