Perlを使ったCGI その2

2012.01.09

受信した情報の処理

■ GETで得たデータの処理例

###### GETで得た値の処理
$query_string = $ENV{"QUERY_STRING"};
if ($query_string =~ /\%23/){
  $query_string =~ tr/+/ /;
  $query_string =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
  $query_string = encode("eucjp", decode("utf8",$query_string));
}

環境変数 $ENV{"QUERY_STRING"} には GET Method で送られるデータが入る。データはURLエンコードされているのでデコードしなければならない。具体的にはまず + を半角スペースに置き換え、次に % の後ろにある16進数を pack関数を使って文字に復元してURLエンコードされたものと置換する。

例示したスクリプトではデータに %23 すなわち # が含まれている場合にURLデコードする条件になっている。また文字コードもUTF8からEUCJPに変換している。

■ POSTで得たデータの処理例

#### フォームからのデータを分析する処理
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
#### 受け取ったデータの編集
@pairs = split(/&/, $buffer);
foreach $pair (@pairs){
 ($name, $value) = split(/=/, $pair);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
####ラベルと内容の関連づけ
 $FORM{$name} = $value;
}

環境変数 $ENV{'CONTENT_LENGTH'} には POST Method で送られるデータが入る。上の例ではそれを $buffer に格納している。このときデータは FORM から送られた name と value の値同士を = で結び、そのセット全体を & で連結した形式になっている。

例示したスクリプトでは必要な情報を取り出すために、まず $buffer を & で切り分けて @pairs という配列に要素として格納している。次に要素を取り出しながら = で切り分けて name の値は $name に、value の値は $value に格納する。このうち $value に関してはデータをデコードして通常の文字に戻す。最後に $name を key とし $value を value とするハッシュを作っている。

■ 追記

上記の機能をメソッドとして持つオブジェクト指向のモジュールを作成した。また既存の CGI モジュールを使う際のスクリプトについては別ページで言及している。

Webページの読み込み

■ getHTTPによる取得

## Search Twitter RSS の内容を読み込む
($http_response_hash, $errorMessage) = &getHTTP($twitter_rss_hash);
%dataHTTP_hash = &analysisHTTP($http_response_hash);
$line_decode_hash = "$dataHTTP_hash{BODY}";
$line_euc_hash = encode("eucjp", decode("utf8",$line_decode_hash));

$twitter_rss_hash には URL が入る。サブルーチン &getHTTP で指定されたURLのファイルを読み込み、&analysisHTTP を使ってメタ情報と内容本体に分離している。getHTTPの入手先等々についてはこちらを参照のこと。

■ 追記

getHTTP についてはこれをメソッドとして持つオブジェクト指向のモジュールを作成した。また LWP モジュールを使う際のスクリプトについては別ページで言及している。

実作例

上記の内容を含む試作例として以下のものがある。

>> Twitter RSS Reader

フォームで選択したり空欄に入力することで、該当するTwitterアカウントの記事をRSS配信されている20個分だけ取得してくることができる。ハッシュタグにも対応した。

▼研究関連メモ目次へ戻る

Copyright(c)2005-2012 ccoe@mac.com Allrights reserved.