
###### 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に変換している。
#### フォームからのデータを分析する処理
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 モジュールを使う際のスクリプトについては別ページで言及している。
## 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配信されている20個分だけ取得してくることができる。ハッシュタグにも対応した。
Copyright(c)2005-2012 ccoe@mac.com Allrights reserved.