- ベストアンサー
perlの文法について
はじめましてstaraman_sです。 今はPerl/CGI辞典という本を使いながらPerlの勉強をしていますが、インターネットで検索しても解決できず困っています。 皆さんのお力をお貸しください。 疑問点 sub getCookie { my ($tmp, $name, $value); for $tmp (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $tmp); $value =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; } } 本の中の掲示板のプログラムの中に上記のようなプログラムが書いてあるのですが、最後の方に$COOKIE{$name} = $value;とあります。変数$COOKIEの後に中括弧を使い{$name}と書いているのは、どういった文法からきているのでしょうか。 よろしくお願いいたします。
- starman_s
- お礼率100% (3/3)
- CGI
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
![noname#96023](https://gazo.okwave.jp/okwave/images/contents/av_nophoto_60_3.gif)
連想配列です ネット上にいっぱい情報が転がっているので、がんばって覚えてください
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
その本に索引があるかわかりませんが、「ハッシュ」で項目がありませんか? もし載っていないようならこの辺も解説している本も買ったほうがよいかも。
![starman_s](https://gazo.okwave.jp/okwave/images/contents/av_nophoto_60_1.gif)
お礼
ありがとうございます。 本にもハッシュ項目はありました。 良く読んで勉強したいと思います。
関連するQ&A
- UTF-8から送信されたデータを日本語化するには?
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A これを あいうえお に変換するには、どのようにデコードすればいいのでしょうか? ご教授お願いします。m(_ _)m [現在のソース] $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; my $value = Jcode::convert($value, 'utf8'); $FORM{$name} = $value; } ↓ 「縺ゅ>縺・∴縺・」が検出されます。
- ベストアンサー
- Perl
- PerlプログラムをPHPで書き直しています
Perlで作ったものをPHPで書き直しています。 似てるようで大変ですね。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; という表現ですが、これをPHPで書き直すとズバリどのように なりますか? ちなみにPERLのソースコードでは、このあと &jcode'convert(*value,'sjis'); になるのですが、PHPでPerlのこの変換を実現する一般的方法が あったら教えてください。その方法で全部書き直そうと思います。
- ベストアンサー
- PHP
- perlの質問
#!/usr/local/bin/perl require 'jcode.pl'; # 漢字コード変換ライブラリ #********** データを受け取る $query = $ENV{ 'QUERY_STRING' }; &parse_param( $query ); $name = $param{ 'name' }; # 投稿者 $email = $param{ 'email' }; # メールアドレス #********** 結果の出力 print "Content-type: text/html\n\n"; print "投稿者:".$name."<BR>"; print "メールアドレス:".$email; exit; #********** 入力したデータの分解 ********** sub parse_param { local( $name, $value ); local( $parse_data ) = @_; @in_params = split( /&/, $parse_data ); foreach $in_param ( @in_params ) { ( $name, $value ) = split( /=/, $in_param ); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge; &jcode'convert( *value, 'sjis' ); $param{ $name } = $value; } } の $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack の部分だけ、何の処理をしているかがいまいちわかりません。 わかる方お願いします。
- ベストアンサー
- Perl
- 入力フォームからの半角カナを認識させたい
入力フォームからの半角カナを全角に変換したいのですが、方法はありますでしょうか。 h2z_sjisを使ってみましたが、うまく行きませんでした。 foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); $FORM{$name} = $value; } <結果> アイウエオ(半角) → 渦慨オ よろしくお願いします。
- ベストアンサー
- Perl
- safariで買い物かごに残らない
ある買い物カゴCGIを使用していますがsafariだと日本語表記の商品だけ買い物カゴに入れても残りません。 次の買い物をしたり買い物カゴを確認した時に入っていません。英数表記の商品は大丈夫です。 CGIそのものが古いので替えるのがベストなんですが、諸事情により当面これを使用しなければいけないので何とか御教授お願い致します。 多分下記の部分が問題だと思うのですがCGIなどは全くの素人なので分かりやすくお願い致します。 *********************************************************** if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 記録するデータはsjisに統一する &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/://g; $value =~ s/,//g; $FORM{$name} = $value; } $soryo = $FORM{$soryo}; #--------# $cookies = $ENV{'HTTP_COOKIE'}; @cookie_pairs = split(/;/,$cookies); foreach $cookie_pair (@cookie_pairs) { ($name, $value) = split(/=/, $cookie_pair); $name =~ s/ //g; $DUMMY{$name} = $value; } $goods_next = 0; foreach $goods_num (1 .. $#cookie_pairs + 1) { $cookie_name = 'CARGO_'.$goods_num; if ($DUMMY{$cookie_name} =~ /^goods:/ || $DUMMY{$cookie_name} =~ /^removed/) { $GOODS[$goods_num] = $DUMMY{$cookie_name}; $goods_next = $goods_num + 1; } } #--------# ***********************************************************
- ベストアンサー
- CGI
- CGIのスクリプトの解釈で分からないところがあります
どうも、こんにちは(@^^@)。 CGIのPerlスクリプトを勉強しています。いろいろ手持ちの本を探してみたのですが、下記のスクリプトの一部の解釈の仕方が分からないので教えてください。HTMLフォームからパスワードを受け取って、照会するスクリプトの一部です。他の行は、大体分かるのですが8行目のみが分かりません。 まず、sと対応するgeの意味。また、hex関数の$1の意味。解説書には、$1は特殊な変数と書いてありましたが、それ以上詳しい解説は、ありませんでした。hex$は、単に16進数を10進数に変換するんですよね。そして、%(..)、pack("c",hex($1))も元の意味が分からないので解釈に困っています。 「パスワードを照会するスクリプトの一部です。」 1: homonsya = $ENV{'QUERY_STRING'}; 2: 3: @group = split(/&/, $homonsya); 4: foreach $ans (@group) 5: {($name, $value) = split(/=/, $ans); 6: 7: $value =~ tr/+/ /; 8: $value =~ s/%(..)/pack("c", hex($1))/ge; #.....???←「16真数を『読める文字』変換」とある。 9: $ok_homonsya{$name} = $value;} 10: 11:$pass = $ok_homonsya{'myName'}; また、ネットで調べようと思い、いろいろ検索してみると下記のような行をよく見かけました。 ☆ $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; こちらもとても疑問の行と似ていますし、今後もよく使いそうな感じなので、気になっています。私は、パスワードを受け取って、管理者フォームに移動するようなスクリプトを作りたいと思っています。どうぞ、よろしくお願いいたしますm(__)m。
- ベストアンサー
- Perl
- perlがうごきません
<html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。
- ベストアンサー
- Perl
- デコードできない時があります><
なぜか「ひらがな」を偶数個送るとデコードしません 例 「あ」→「あ」 「ああ」→「縺ゅ≠」 「ああい」→「ああい」 「ああいい」→「縺ゅ≠縺・>」 「ああ質問」→「ああ質問」 「ああアあ」→「ああアあ」 今の所漢字やカナを含めて偶数個では問題無いです。 use lib './lib'; use Jcode; read(STDIN, $POST, $ENV{'CONTENT_LENGTH'}); @_post = split (/&/,$POST); foreach $tmp (@_post) { ($name,$value) = split (/=/,$tmp); $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; Jcode::convert($value,"sjis"); $box{$name} = $value; } デコード処理はこんな感じです。 JcodeはJcode-2.07を使ってます。 独自で色々調べたのですが解決策が見つからず大変困っております。 宜しくお願いします。
- 締切済み
- CGI
- デコード処理部分のプログラムについて
デコード処理部分のプログラムで分からないトコがあるので教えてください。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'euc'); この『pack("C", hex($1))』、『eg』の部分の意味がよく分かりません。 『&jcode'convert(*value,'euc');』の部分も微妙なので、お願いします。
- ベストアンサー
- Perl
- 半角スペースが有効にならない。
前のページで入力された値を取得するCGIですが、どうしても半角スペースを認識しません。 それどころか、半角スペースの後ろを一切消してデータを取得しています。 同じように作成したものはきちんと動いているのに…。 どこが間違ってるかご指摘お願いします。 ---------- #!/usr/local/bin/perl read(STDIN,$buffer,$ENV{'content_length'}); @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ tr/+/ /; $value =~ tr/+/ /; $key =~ tr/+/ /; print "Content-type:text/html\n\n"; print "$key<BR>\n"; print "<A HREF=./***.cgi>Back</A><BR>\n"; open (FH,">***.log"); @filew="$buffer\n"; print FH @filew; close(FH); exit; ---------- 以上です。よろしくお願いします。
- ベストアンサー
- CGI
お礼
ありがとうございます。 連想配列で検索したところ、良く理解できました。