
以下のスクリプトについて質問があります。かなり多いのですが・・・
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 の * の意味
多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
まず、このサブルーチンは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つに分けます。
No.4
- 回答日時:
>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" サンの特設アンケートって、たわいないですね、今知りました。
No.2
- 回答日時:
>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;
が必要ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Ruby vscode 文字化け 1 2022/05/21 19:17
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
中国語のコードについて
-
Perlの文字コード変換について
-
文字コード
-
マッチングアプリで新しくアカ...
-
エクセルで数値を全角文字(カ...
-
JISとシフトJIS
-
Excel2003 IF関数の条件指定方法
-
EXCELで、一つのセルに書かれた...
-
Perlでさらに気の利いた文字列...
-
JISの全角判定処理について
-
特定の文字を削除したい
-
住宅にカナを入力する際に丁目...
-
マイク取得音声のテキスト変換
-
html内のカタカナを全て全...
-
文字同士の比較~抜き出し
-
シェルで文字列を置換したい。
-
この正規表現の意味は?
-
Excelについて質問です。 セル...
-
同一連続文字の改行(テキストエ...
-
トリッププログラム!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InputMan の imTextについて
-
文字実体参照が勝手に変換され...
-
チェックボックスの複数選択の...
-
もっとも初歩的なデータの渡し方を
-
常用漢字?でない文字を判定す...
-
機種依存文字の文字コード変換
-
色の指定
-
formデータのデコード「s///」...
-
半角と全角の文字数カウント方法
-
Perlの初歩
-
正規表現でカンマを対象にする方法
-
特殊文字をPOSTした際の動作は?
-
次ページ処理で途中つまりました
-
文字化けを回避したい
-
ダブルクォート文字などをフォ...
-
index関数と英語文字
-
nkfとjcodeの使い方の違いについて
-
SJISに関する少々複雑な問題
-
パターンマッチ変換について
-
戻り値の意味がわかりません…
おすすめ情報