ベストアンサー Perl初心者ですが 2000/12/20 01:16 Perl初心者ですが、次の内容を説明してください。 $Word =~ s/(\W)/$escape{$1} ||= sprintf("%%%02X", ord($1))/eg; みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー y_oku ベストアンサー率62% (25/40) 2000/12/20 02:31 回答No.1 CGIに渡す文字列をエンコードしているのですね。 細かい関数の意味などや変数の意味は知っているものとして、説明します。 分からなかったら補足してください。 「\W」、つまりアルファベットや数字「以外」の特殊文字や漢字を、 %XXの形の16進数の数列に変換しています。 $Word='ほげ';は$Word='%A4%DB$A4%B2';に変換されますよね。 掲示板などのCGIの中に記述されていたものでしょうか? こうしておかないと渡されたCGIのほうで文字化けが起こったりして、 正しい文字列が渡されないのです。 ちなみに、この部分は$escape{$1}の部分がない次のスクリプトでも 同じように動くはずです。 $Word =~ s/(\W)/sprintf("%%%02X", ord($1))/eg; これならわかるでしょうか? じゃあ$escape{$1}はなにかというと、変換キャッシュとでもいうのかな。 sprintf関数は時間がかかるので、一度変換したことがある文字は、 その結果を%escapeというハッシュに保存しておいて使いたい。 つまりハッシュがあるときはそちらをつかい、ないときはsprintfの結果を代入するのが、「$escape{$1} ||=」の部分の意味ですね。 CGIやHTMLについてよく書いてあるページをリンクしておきますので、 そちらも参考にしてみてください。 参考URL: http://wakusei.cplaza.ne.jp/twn/wwwcgi3.htm#CgiEncode 質問者 お礼 2000/12/20 12:33 丁寧な解答、ありがとうございました。 $escape{$1}のなぞが解けました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Perl 関連するQ&A [Perl] unpackで不要文字にエンコード Perl CGIについてです。 文字列をエンコードしようと次のようにしてみました。 $val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、 $va2のエンコード文字に不要な'25'が含まれるようになってしまいました。 例:「ガム」をエンコード >> %A5%AC%A5%E0 を期待していたのですが、結果は %25A5%25AC%25A5%25E0 と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。 ひらがなから全角カタカナへの変換の仕方 Perlでひらがなから全角カタカナへの変換の仕方について教えてください。 ここのサイトで「全角カタカナからひらがなへの変換」の仕方が書いてありました。コレを元に逆に指定すれば出来るかな?って思ったのですが。。。どうやればいいのか全くわかりません。たぶんですが文字コードなどで指定しているとは思うのですが。。。どなたかわかる方がいましたら教えて下さい。よろしくお願いします。 #全角カタカナからひらがなへの変換の仕方 $a =~ s/(\x83)([\x40-\x7e])/"\x82".sprintf("%c",ord($2)+0x5f)/eg; $a =~ s/(\x83)([\x80-\x96])/"\x82".sprintf("%c",ord($2)+0x5e)/eg; 上記の逆に「ひらがなから全角カタカナへの変換」出来るようにしたいです。よろしく御願いします。 phpの日本語変換 perl で日本語を下記のコードで変換しています $fname =~ s/(\W)/sprintf("%%%02X", ord($1))/ego; PHPからperlへの変換のコードがわかりませんよろしくお願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 日本語でクッキーを読み書きしたいんですが。 初心者用の文献読むのですが、クッキーはカウンターの説明ばかりで、日本語を扱えません。 また、クッキーの解説HPでは、 >CGI(Perl)でエンコードするには次のようにします。 >$xx =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; >CGI(Perl)でデコードするには次のようにします。 >$xx =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; と、書いてあるのですが、どこを書き換えればいいのでしょうか。ぜひご伝授をお願いします。 なお、只今改造中のソースは以下のURL掲載に掲載されております。 http://softplaza.biglobe.ne.jp/text/cgi/cgi13/cgi13-4.html アルゴリズム解析をしてるのですが… いくつかのperlを解説したページを読んでみたのですが、 以下の文でフォーマットとしての"%02x"の意味と 「^」(演算子?)の意味がわからずつまづいてます。 $val =~ s/./sprintf("%02x",ord($&)^ord($aaa[$i++ % @aaa])))/ge どなたか教えてください・・・ 日本語のエンコード 日本語 秘華をPHPでエンコードすると $fname = "秘華"; $name = rawurlencode( $fname ); %94%E9%89%D8 になり Perlで 秘華をPHPでエンコードすると $fname =~ s/(\W)/sprintf("%%%02X", ord($1))/ego; %20%94%E9%89%D8 になります PHPエンコードを%20%94%E9%89%D8 になるにはどのようにすべきですか よろしくお願いします。 Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコ Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコードするにはどんなコードを書けば良いのでしょうか。 "あ"という文字をHTMLフォームから受取って%82%A0というS-JISのバイトコードに再エンコードするコードを質問したら $a = "あ"; $a =~ s/([^a-zA-Z0-9*\-.@_])/sprintf("%%%02X", ord($1))/eg; $a =~ s/%20/+/g; print $a; という答えを頂きました。コードの意味はよく判らなかったのですが、ちゃんと思惑通り$aは%82%A0になりますので長い間重宝にさせていただいています。 今度は$a="あ";の値をUTF-8の%E3%81%82にエンコードしたいのですが、どのように上記のコードを変更すればよいか教えてください。正規表現というのを使えば出来るのでしょうが、本で読んでもやっぱりわかりません。 mac OSXでperlをするには?(perl超初心者) OSXのLibraryのなかにperlというフォルダがありますがもうすでに このなかにperlがはいっているのでしょうか? またはいってなければどこからダウンロードすればいいのでしょうか? また使い方などを初心者むけにやさしく説明しているサイトなどは ありませんでしょうか? Perl 文字変換 Perlで全角英数字を半角英数字に変換させたいのですが、 Jcodeを使わずにできる方法を教えてほしいです。 例えば zenkaku→zenkaku のようにです。 $value=~ s/$a\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$b/pack("C", ord($1) - 0x80)/oeg; こういうのを試してみたのですが、上手く行きませんでした・・・ AppleScript(or Perl)でURLエンコードするには? AppleScriptでURLエンコードするにはどのようにすれば良いのでしょう? Perlを使えばできそうなのですがうまくいきません。例えば”あ”をエンコードしようとして、do shell scriptコマンドから echo 'あ' | perl -pe '~s/([^?w ])/"%".unpack("H2", $1)/eg;' としても"%a4%a2"が正しいのですが、"%e3%81%82%0a"が返ってきます。 暗ーいトンネルに入ったような状態です。どなたかお力をお借りできないでしょうか? PerlのCGIで投稿された文字を縦書きに。 いつもお世話になってます。 少し前に質問を投稿したはずなんですが検索しても出ないし メールも届かないしで・・・もう一度投稿させて頂きます。 只今Perlでフォームから投稿された文字が縦書きに表示される様に作ってるのですが…行き詰まってしまいました。 自分で出来たのは $message =~ s/(<[^>]+>)|(\&\w+;)|([-.!~*'()\w;\/?:\@=+\$,%#\[\]\^`"{|}]{1})/($3 eq '')?(($2 eq '')?$1:"<BR>$2"):"$3<BR>"/eg; こんなショボーイ記述になってしまいまして・・・・ これでは半角英数字だけしか縦書きにならないし、おまけにどこまでも一列に縦書きにされて次の行へ行かず、長ーくなってしまいます。 どうににか15文字目で</TD><TD>タグを入れて次の行へ移れる様にしようと他の縦書きCGIの中身を拝見したりと研究してみたのですが さっぱりわからず・・・どうか助けていただけないでしょうか。 宜しくお願い致します。 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のこの変換を実現する一般的方法が あったら教えてください。その方法で全部書き直そうと思います。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム Perlの数値・文字列操作 Perlで以下の16進数の連続した文字列を db444500 配列に入れて後からわかりやすい16進数で表示させたり、 foreach (@list){ print sprintf("%02X ", $_); } 直接文字列として、 0xdb, 0x44, 0x45, 0x00 と表示させるには、どのような書き方をすれば良いのでしょうか? mysql_real_escape_string 独学数ヶ月の初心者の質問で恐縮です。 もろもろの事情で仕方なくmysql_real_escape_stringを 以下(1)のように使用しなくてはならないと仮定し、 セキュリテイの面で(2)のようにシングルクオテーションつける 事で危険を回避できますか? またシングルクオテーションは(2)のようにつけてはいけない とかありますか?(記述の基本が曖昧なため、ただの確認の質問) (1) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", mysql_real_escape_string($id), mysql_real_escape_string($password)); (2) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", ’mysql_real_escape_string($id)’, ’mysql_real_escape_string($password)’); よろしくお願いします。 perlでcsvの指定フィールドに書き込みする方法 perlを勉強中の初心者です。 以下のような入力ファイル(csv)があった場合、特定のフィールド(この場合"0")を参照して、その数字を元に、出力ファイルには、参照したフィールドからデータ書き込むプログラム方法を教えてください。 ---入力ファイル 0,a,b,c 1,d,e,f 2,g,h,i 10,w,s,x ---出力ファイル 0,a,b,c ,1,d,e,f ,,2,g,h,i ,,,,,,,,,,10,w,s,x MySQLとPHP、Perlの連携はどうするの? Apache、PHP、Perl、MySQLをインストールしました。 次に、PHP、PerlでMySQLを使えるようにしてほしいと言われました。 なんのことかさっぱりなので、 なにをすることなのか、なにをもとめられているのか、 初心者で意味不明です。この内容について、詳しいサイトとかないでしょうか? また、実際にどのように実施すればよいか教えてください。 PHPのSQLインジェクションはsprintf? PHPのSQLインジェクションですが、sprintf内でクォートをしてあるとそれで大丈夫なのでしょうか? 以下のようなコードがあり、nameは画面入力なのでSQLインジェクションが起こるのでは? と作成者に確認したところ、"%s"してあるから大丈夫との返事をもらいました。 ネット調べるとmysql_real_escape_stringでエスケープしてから"%s"で変換すれば大丈夫といった内容は見つけたのですが、mysql_real_escape_stringなど不要との返事をもらいました。 なぜ?と聞くとそういうものだとしか回答がありません。 sprintf('UPDATE users SET name = "%s" WHERE id = %d', name, id); 結局上記のコードでSQLインジェクションは解消されているのでしょうか? セキュリティ プログラム初心者です PDOやる前にmysqliの手続き型で勉強中です 手続き型でフォームから入力された値をこんな感じにするのは危険でしょうか? 悪意を持ったユーザーに簡単に突破されますか? if(!empty($_POST['name'])){ $sql = sprintf('SELECT * FROM hoge WHERE name="%s"', mysqli_real_escape_string($link,$_POST['name']) ); } 更新するとき if(!empty($_POST['name'])){ mysqli_query($link,sprintf('UPDATE hoge SET name="%s" WHERE id=%d', mysqli_real_escape_string($name), mysqli_real_escape_string($link,10) )); } よろしくお願いします perl超初心的な質問 perl初心者です。 辞書ファイルを編集するのに必要外な文字が多く、手作業では限界がありperlを使おうと思います。 ちまちまと自分で打ったのですが、いざ実行するとうまくいきません。 右も左もわからず途方にくれてます。 下が編集したい文です。 行の最初の”を削り、読んだものに上書きしたいのです。 "さ来週 [さらいしゅう]","(n-adv,n-t) week after next","",0,0,0,"" "さ迷う [さまよう]","(v5u) to loiter/to putter/to prowl/to wander about/to roam about/to knock around","",0,0,0,"" "ざあざあ","(adv) sound of rushing water/sound of pouring rain/white noise sound/(P)","",0,0,0,"" そして下の文が打ったperlの内容です。 $inputfile="DicA.csv"; open(DIC,"$inputfile") or die "$!"; -----------画面に表示される while ($line1 = <DIC>){ $string =~ s/"//g; open(OUT,"> DicA.csv"); ----------上書きされ空のファイルができる $out1 = join(",",@array); print OUT; } close(DIC) お手数をおかけしてすみません。 困っています。 どうかよろしくお願いします。 WindowsXPでperlを使って貰うにはどうすればいいでしょうか? perlで作ったプログラムを英語が読めず、説明書を見ながらOfficeのインストールしかやったことの無い、パソコン初心者の方に、perl環境をセットアップしてもらうのは意外と大変です。 かと言って、ActivePerlを添付して配布するわけにもいきませんし、 どのようにすれば気軽に使ってもらえますかね? 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
丁寧な解答、ありがとうございました。 $escape{$1}のなぞが解けました。