ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

PerlプログラミングTips集(起動編)

 Perlプログラムをするときのノウハウ集です。

perl で、コマンドを起動する方法

 perlで、プログラムやコマンドを起動する方法には、いろいろな方法があります。

perl でパイプを扱う方法

 パイプを使用して、出力したデータを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のパラメータ解析処理

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


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp