プロが教える店舗&オフィスのセキュリティ対策術

以下のスクリプトについて質問があります。かなり多いのですが・・・


sub DecodeForm
#返り値:Name=>Val のハッシュ(グロブ)
#使用例:*form = EncodeForm(); print $form{name};
{
my($encoding) = @_;
my($method) = $ENV{'REQUEST_METHOD'};
local($query, @in, $key, $val);
require 'jcode.pl' if $encoding;
if ($method eq 'GET') {
$query = $ENV{'QUERY_STRING'};
}
elsif ($method eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}

local(@query) = split(/&/, $query);

foreach (@query) {

tr/+/ /;

($key, $val) = split(/=/);

# %HH形式を元の文字にデコードする。
$key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;

$val =~ s/\r\n/\n/g;

jcode'convert(*key, $encoding) if ($encoding);
jcode'convert(*val, $encoding) if ($encoding);

$in{$key} = $val;
}
return *in;
}


多いので先頭から順に箇条書きにさせて頂きます。

・Name=>Val の意味。(#以下がメモであることは分かっています)
・グロブとは何か
・*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません)
・my $encoding という変数も見たことがあるのですが、my($encoding) と my $encoding はどう違うのか。
・クエリとは何か
・jcode.pl とは、インストールしたPerlに標準でついているライブラリなのか?そうでないのならjcode.plとは何か?
・%HH形式とは何か
・\rの意味
・jcode'convert の意味
・*key の * の意味
・*in の * の意味


多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。

A 回答 (4件)

まず、このサブルーチンはDecodeFormというもののようですので、3行目の


#使用例:*form = EncodeForm(); print $form{name};

#使用例:*form = DecodeForm(); print $form{name};
だと思われます。

>Name=>Val の意味
連想配列(ハッシュ)は
$price{'apple'} = 10;
$price{'melon'} = 50;
という代入の仕方をしますが、それとは別に
%price = ('apple' => 10, 'melon' => 50);
という代入も可能です。$form{Name}の値がValであるハッシュを生成するサブルーチン、ということを言っているのだと思います。

>グロブとは何か
>*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません)
>*key の * の意味
>*in の * の意味
Perlでは例えば
$price = 'free';
$price[0] = 20;
$price[1] = 30;
$price{'apple'} = 10;
というように同じ「price」という識別子に違う値を持たせられます。この時に
*buy = *price;
とすると、
$buy = 'free';
$buy[0] = 20;
$buy[1] = 30;
$buy{'apple'} = 10;
というようになります。
このような*のついた変数型をグロブ(型グロブ)と呼びます。
*form = DecodeForm();
というように使うと、このサブルーチンの返り値がスカラーであっても配列であってもハッシュであっても同じように使える、ということです。
実際にスクリプト内で使う場合は、
*form = DecodeForm();
または
%form = DecodeForm();
とするだけで、フォーム内のフィールドの値(例えば<input type="text" name="price" size="5">というフィールドに100という値が入っていたとして)、
$form{'price'}の値が100になる、ということを言っているのだと思います。

長すぎて入りきらないようなので2つに分けます。
    • good
    • 0

>toyota_sera_1990 さま、ステキ、親切、心あたたまる穏やかな、記述にびっくり。

(プロフィール拝見させて戴きましたが、まだ、4日前からなんですね。)
>fortunefeeling さんへ
こんにちは、そして、はじめまして。私はあまり詳しくないので、知っていると勘違いしていること、だけでもよいかしら? (2006/2/14 より"OKWave"参加)

4日位後輩です。

型グロブ :
*M_PI = \3.14159265358979323846; とすると、以後 "$M_PI" は参照しか出来ないみたいです。(どうしても、書き変えしてほしくないものに)

jcode.pl :
どこの、レンタルサーバーでも、良く使われる "cgi" から呼ばれる、誰でも入手可能な、コード変換 "perl"みたいです。(よろしければ、いつでもさしあげますよ。なかみを覗くと、"jis" "sjis" "euc" の記述ありますが、"utf-8" は、ないみたいです。)

\r :
詳しくは、知りませんが、"C/R" "\x0D" "\015" でわかります?
C/R は キャリッジリターン
\x0D は、16進表現
\015 は、 8進表現

require 'jcode.pl' :
って、私の本では、ダブルクォテーション 使ってますが、おんなじなんでしょうか? (他の "perl" 呼ぶ)

my($encoding) :
局所変数宣言(同じ変数名、外で使っていても、影響与えない)、一個(変数)でも、カッコつけたほうが、私も好きです。

全然、関係ありませんが、"OKWave" サンの特設アンケートって、たわいないですね、今知りました。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

お礼日時:2006/02/18 00:52

#2の中で¥となっているのは¥記号(半角)です。


なんか文字化けしたみたいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!カナリ分かりやすかったです。多謝です!

お礼日時:2006/02/18 00:48

>my($encoding) と my $encoding はどう違うのか。


my($encoding) = 'jis';

my $encoding = 'jis';
は同じです。複数の変数を同時に定義するときはカッコ必須で
my ($encoding1, $encoding2);
というようになります。

>クエリとは何か
元々はデータベースに対する要求を指す言葉なのですが、フォームに入力した内容をこう呼ぶこともあります。特にPerlの用語というわけではありません。

>jcode.plとは何か?
>jcode'convert の意味
日本語のコードを変換するライブラリで、別にインストール(アップロードして置いておくだけ)の必要があります。下のサイトからダウンロードできます。
http://srekcah.org/jcode/
*keyに入っている日本語データのコードを変えるときに
jcode'convert(*key, $encode);
というように使います。$encodeの中味は'jis', 'sjis', 'euc'のどれかで、それぞれJIS、Shift-JIS、EUCに変換します。

>%HH形式とは何か
よく検索エンジンなどの検索結果のURLで“%95%B6%8E%9A%97%F1”みたいな文字列(%は半角)を見たことがあると思いますが、これのことです。URLエンコード形式と呼びます。英数字以外の特殊文字はURLと一緒に送れないことがあるので、この形式に変換します。

>\rの意味
Carriage Returnのことです。早い話が改行なのですが、改行のコードはプラットフォームによって異なっており、Windowsだと「¥r¥n」、Macintoshだと「¥r」、UNIXだと「¥n」になっています。
$val =~ s/\r\n/\n/g;
の行は、Windows仕様の改行コードをUNIX用に変換しています。
※このままだとMacintoshの場合の変換ができませんからもう1行
$val =~ s/¥r/¥n/g;
が必要ですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!