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; } |