
http://oshiete1.goo.ne.jp/kotaeru.php3?q=393199
の続きのようなかんじですが…。
下記のコードがわかりません。
おわかりになるかた解説してください。
sub setCookie{
local($tmp, $val);
$val = $_[1];
$val =~ s/(\W)/sprintf("%%%02X", unpack("C",$1))/eg;
$tmp = "Set-Cookie:";
$tmp . = "$_[0]=$val;";
$tmp . = "expires=Thu, 1-Jan-2030 00:00:00 GMT\n";
return($tmp);
}
1行目:サブルーチン名
2行目:$tmp,$valをそれぞれローカル変数に設定。
3行目:?
4行目:$valを16進数から1バイトずつ変換?
5行目:$tmpに"Set-Cookie:"を代入。
6行目:$tmp.に"$_[0]=$val;"を代入。
7行目:$tmp.に"expires=Thu, 1-Jan-2030 00:00:00 GMT\n"を代入。
8行目:?
というところまではなんとか解釈したのですが、「?」の部分がわかりません。
Set-Cookieヘッダを作成しているらしいのですが…。
No.2ベストアンサー
- 回答日時:
とりあえず?の部分だけ。
>$val = $_[1];
これはサブルーチンの引数を取得しています。
$res=&sub_test(a,b);
このような文でaとbが引数となります。
この引数は@_という配列に順番に格納されます。
この配列の2番目を表すのが$_[1]です。
そのため$_[1]には二番目のbが入ります。
>$val =~ s/(\W)/sprintf("%%%02X", unpack("C",$1))/eg;
これはURLエンコードですね。特殊文字や漢字(2バイト文字)を%と16進表示(2桁)に変換しています。
>return($tmp);
これはサブルーチンの返り値ですね。
先の例では$resに入る値です。
正確には&sub_test(a,b)自体がこの返り値そのものになります。
print &setCookie();
と
print Set-Cookie:~;
は同じ意味と言うことです。
以前の質問から$_[0]はクッキー名、$_[1]はその値になると思います。
その値だけをURLエンコードしてSet-Cookieの文を作って返しているということです。
ちなみに$tmp.ではなく.=で連結するという意味です。
$tmpに.=で内容をつなげているということです。
回答ありがとうございます。
#1の方の回答と併せてみて、
>$val = $_[1];
の部分はおぼろげながら自分の中でわかってきたみたいです。
>$val =~ s/(\W)/sprintf("%%%02X", unpack("C",$1))/eg;
このへんはまったくわかりません。
自分で変換するために文章をかけといわれたらできません。
コピペしてる状態です。
~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
というのはよくみかけるのですが…。
print &setCookie("KAISUU",$time_new);
ということは、
print "Set-Cookie:KAISUU=$time_new; expire・・・;"
ということでいいのでしょうか?
.は続けて、ということなのですか?
No.4
- 回答日時:
う~ん、とりあえず見直しはされた方が良いですよ。
まず、
read(STDIN, $cookie, $ENV{'CONTENT_LENGTH'});
これは必要ありません。
これはPOST受信時の処理です。
次に
$value =~ s/%[0-9A-fA-f][0-9A-fA-f])/pack("C",hex($1))/ego;
これは%のあとの括弧が足りません。
正確には
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/ego;
です。
あと
$COOKIE{$name}=$value;
これは$nameではなく$keyを使っているはずですから
$COOKIE{$key}=$value;
となります。
ほとんどケアレスミスなのでもう少し注意深くチェックすれば直せると思います。
できました!!ありがとうございます!!
だいぶケアレスミスが多いですね…。
かくときに自分の意志でかいてないからでしょうか。
(人がかいたのを自分でそこそこかんがえながら書いてるところです。)
ここで一度締め切ります。
またわからないことがあったら、再度質問させていただきます。
その時はよろしくお願いします。
何度もありがとうございました。
No.3
- 回答日時:
>print &setCookie("KAISUU",$time_new);
>ということは、
>print "Set-Cookie:KAISUU=$time_new; expire・・・;"
>ということでいいのでしょうか?
そうです。
>.は続けて、ということなのですか?
そうですね。
$xxx .= $yyy;
$xxx .= $zzz;
で
$xxx = $xxx$yyy$zzz;
ということです。
変数の内容を後ろに連結していくと考えてください。
>>$val =~ s/(\W)/sprintf("%%%02X", unpack("C",$1))/eg;
>このへんはまったくわかりません。
私も正直言って何も見ずに作れとか解説しろと言われても出来ません。
正規表現やpack関数は難しいので少しずつ理解して行けば良いと思いますので今はコピペで構わないと思いますよ。
こちらがエンコードについて詳しいです。
http://ash.jp/perl/tips_perl01.htm
あと正規表現はこちらです。
http://www.din.or.jp/~ohzaki/regex.htm
>~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
>というのはよくみかけるのですが…。
これはURLデコードですね。
URLエンコードで暗号変換したものを復元するための記述です。
GETやPOST送信では自動的にエンコードされますが、デコードはされないので記述されることが多いのでしょう。
回答ありがとうございます。
ちゃんと自分で理解というかわかっているみたいなので安心しました。
>私も正直言って何も見ずに作れとか解説しろと言われても出来ません。
>正規表現やpack関数は難しいので少しずつ理解して行けば良いと思いますので今はコピペで構わないと思いますよ。
そうなんですか。安心しました。
そのうち見ないでかけるようになることを祈ります…。
さて、下記のようにかいてみました。
※クッキーの書き込みではなく読み込みです。
#!/usr/local/bin/perl
# Cookieを読み出す。
&getCookie();
$name=$COOKIE{'KAISUU'};
print "Content-type:text/html\n\n";
print $name;
sub getCookie{
local($cookie,$cookie3,$key,$value);
$cookie=$ENV{'HTTP_COOKIE'};
read(STDIN, $cookie, $ENV{'CONTENT_LENGTH'});
@cookie2=split(/; /,$cookie);
foreach $cookie3(@cookie2){
($key,$value)=split(/=/,$cookie3);
$value =~ s/%[0-9A-fA-f][0-9A-fA-f])/pack("C",hex($1))/eg;
$COOKIE{$name}=$value;
}
}
exit;
ですが、
'*****\cookie_test.cgi' script produced no output
となってしまいます。
どこがおかしいのでしょうか?
おわかりになりましたらよろしくお願いします。
No.1
- 回答日時:
$cookie = setCookie("name", "ほげ");
というように呼ばれていると思いますが
3行目は
$var = "ほげ"; というようになります。
$_[0] は name が入る。
8行目は作成した文字列を返しています。
結果
"Set-Cookie:name=%A4%DB%A4%B2;expires=Thu, 1-Jan-2030 00:00:00 GMT\n"
が返ります。
回答ありがとうございます。
&setCookie("KAISUU",$time_new);
のように使用しているみたいです。
となると、
$var=$time_new;
$_[0]="KAISUU";
となっているのでしょうか?
$valと$tmpの[0]と[1]はそれぞれ、配列の時に使用するような意味のそれぞれの数字なのでしょうか?
(うまく説明できてなくてすいません。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- Excel(エクセル) エクセルのマクロが途中の行から適用されない 2 2022/07/09 20:25
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/11 11:05
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
Excel VBAで行追加後の...
-
CGIやPHPで外部ファイルの内容...
-
フォームからの値
-
linq で 楽天ウェブサービスのX...
-
プログラムの作り方。アイディ...
-
ブルダウンで1項目を選択したの...
-
途中まで出来ているのですが‥(D...
-
CGIでのページ指定~その(2)
-
VB2010 のユーザコントロールの...
-
このCGIサブルーチンを解説して...
-
【VB2005】メソッドに渡したデ...
-
フォーム入力(CGIでデータ取得)...
-
LISPで連想配列の操作?
-
FLASHとCGIでのデータの受け渡...
-
perlでtelnetクライアント
-
C言語:単語カウント
-
【プルダウンで選んでGOボタン...
-
Pythonのプログラミングの質問...
-
Perlの書き方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
リロード後にプルダウンの選択...
-
map(STL)でinsertを行いたいで...
-
CGIでのページ指定~その(2)
-
CGI(Perl)で、Net::FTPを使いたい
-
linq で 楽天ウェブサービスのX...
-
ラズパイで感圧センサーを動か...
-
gpioを使ってSPIをシミュレーシ...
-
アンケートフォームのvalueの値...
-
iteratorの再利用について
-
Perlでアルファベットを数...
-
途中まで出来ているのですが‥(D...
-
VB2010 のユーザコントロールの...
-
半角スペースが有効にならない。
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
セレクトメニューで2つの項目...
-
<SELECT>タグの折り返し
-
16進の10進変換について
おすすめ情報