• 締切済み

正規表現のo

http://ash.jp/perl/tips_perl01.htm のサイトに # URLエンコード $arg =~ s/(\W)/'%'.unpack("H2", $1)/ego; と書かれていましたが、最後のoの効果が分かりません。 $argが何という文字であったなら、そのoが有る場合と 無い場合の違いが分かるのか、具体的な$argの値と一緒に 説明してください。

みんなの回答

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.1

こんばんは。パターンマッチの際の「o」オプションは、 正規表現のコンパイルを最初の1回のみ(once)行うという意味で、 CGI 実行のパフォーマンスに関係するものです。 正規表現が変化しない場合、マッチのたびにコンパイルし直すのは無駄ですので このオプションを指定します。 また置換の際の「o」は、「パターンの中に変数があった時、 gオプションでの複数のマッチングの時に変数の値の展開を1度だけ行う」意味です。 上記の例はこれに該当するものです。

参考URL:
http://math.josai.ac.jp/~yamasaki/lit2/perl/perl05.html,http://www.bb.wakwak.com/~r360/cginote/bunpo/chapter04.html
ninmurai
質問者

お礼

ありがとうございました。 質問するカテゴリを間違えていました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • URLエンコードの正規表現のoの効果

    http://ash.jp/perl/tips_perl01.htm のサイトに # URLエンコード $arg =~ s/(\W)/'%'.unpack("H2", $1)/ego; と書かれていましたが、最後のoの効果が分かりません。 $argが何という文字であったなら、そのoが有る場合と 無い場合の違いが分かるのか、具体的な$argの値と一緒に 説明してください。

    • ベストアンサー
    • Perl
  • PHPの正規表現について

    // URLエンコード $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; これをPHPの関数を使った方法と使わなかった方法が知りたいです。 また、正規表現で、ereg.., preg.., mb_eregがありますが、この違いの詳細が知りたいです。

    • ベストアンサー
    • PHP
  • 正規表現の o オプションの意味が分かりません

    正規表現の質問です。 言語はPerlで組んでいます。 いくつかのhtmlファイルを順に開き、以下のようなコードを実行します。 $http{BODY}=~ /(?<=\[ No\.)([0-9]{$digit})(?= \/ $num)/o; ここで $http{BODY} 読み込んだhtmlファイル $digit 変数。整数値。 $num 変数。整数値。 この正規表現で、 ・・・・[ No.2 / 3 ]・・・・ といった感じの文字列から、この場合は「2」をマッチさせようとしました。 ところが最初に読み込んだファイルではうまくマッチしたのですが、2番目のファイルではマッチしません。 o オプションを外すとうまくいきました。o オプションは変数展開を1回行うとのことです。元のファイルはやたらとでかいので、o オプションを付けたら少しは早くなるかなと思いつけていたのですが。。。 ネットで調べると、 while( $s = <FH> ){ # 一度だけ展開する if ( $s =~ /$arg/o; ){ .... } このような用例で、$argは変数というよりも、セットされた文字列として評価されるとあります。でも前述の正規表現の2つの変数、$digitと$numは普通に値を書き換えられていましたけど。。。 それとも o オプションを付けた正規表現では、その正規表現を処理するためのメモリ領域に一度変数の値を取り込むと、二度と読み込むことをしないということでしょうか。だから変数の値が変わっても、正規表現が用いるメモリ領域の値は変化しない。。。 でも $http{BODY}=~ /(?<=\[ No\.)([0-9]{$digit})/o; だったらちゃんと$digitの値が変わったことに対応しているんです。他にもいっぱい o オプションを付けた正規表現を用いていますけど、全部正常に作動しています(バグに気づいていないだけかもしれませんけど)。 前述の正規表現とこれら正常に作動する正規表現の違いは、後者が変数1個であるのに対して、前者は2個であるということです。「変数展開を1回行う」の意味は、変数1個にしか対応しないという意味なのでしょうか。でも前者も最初のファイルだけなら2個の変数に対応しているのです。 どういうことなのでしょう。

    • ベストアンサー
    • Perl
  • 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] 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の文が悪いのでしょうか?ご教示ください。

    • ベストアンサー
    • CGI
  • URLデコードした文字列からURLエンコード

    よろしくおねがいします。 質問掲示板の中にある検索で質問掲示板の中身を検索した時に、同時にGoogleでも検索しようとおもっています 初めにフォームから得られたクエリーをデコードして &jcode'convert(*val, 'sjis'); に変換しました。 これで得た文字列で質問掲示板の中身を検索します。 つぎに、この文字列をエンコードしてGoogleに渡そうと思いましたが、ここでつまずいてしまいました。 &jcode'convert(*sarchword,'euc','sjis'); #---------- $sarchword =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $sarchword =~ s/(\W)/'%'.unpack("H2", $1)/ego; #---------- #↑このどちらかを行ってから $sarchword =~ tr/ /+/; これでできると検索して出てきたのですが、それでも正しい結果を得ることができず、文字コードの変換も'euc'を'sjis'等といろいろ変換してみてもできずに困っています。エンコードした結果の文字コードがまったく別のコードになってしまうみたいなのです。 たとえば「あいうえお」と検索したときに、上の方法でエンコードすると「%a4%a2%a4%a4%a4%a6%a4%a8%a4%aa」という値になります。 正しい結果を得る方法を教えていただけないでしょうか。 意味がわかりませんでしたら、再度説明いたしますのでよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現のタイプがわからない(初心者)

    正規表現で置換ができることを知り、こういうサイトを見つけました。 @IT:Windows TIPS -- Tips:複数ファイルの文字列置換をワンクリックで行なう http://www.atmarkit.co.jp/fwin2k/win2ktips/308strrpl/strrpl.html そこでreplace.wsfを作りましたが、正規表現がうまくいきません。 replace.wsfは正規表現を使う場合は "/ /g" で囲うらしいのですが urlのようなスラッシュ / が多いものを円記号 \ でエスケープしましたがうまくいきません。 さらに http://msdn.microsoft.com/ja-jp/library/aa293063(VS.71).aspx というサイトで任意の文字をドット . で置換したいんですができません。 以下書いたものを載せます 文字はアンダーバー _ で書いています strRepl="/http:[\/][\/]______.____.jp[\/]____/____[\/][0-9][0-9][0-9][0-9][\/][0-9][0-9][\/][0-9][0-9]/g"; /* 置換対象文字列 */ [\/]はかっこなしでも試しましたができませんでした [0-9]の部分は年月日が入ります。 replace.wsfで正規表現を実現させることができません。 正しい方法を教えてください!!

  • PerlでHTTP~取得できないページがあるのですが。

    任意のページを取得するために、ASHさんのスクリプトを使ってい ます。 ところが、どうにも取得できないページがあります。 ブラウザでは見れるのに、このスクリプトでは取得できません。 ダンプをとってみると、404not foundが返却されます。 想像ですが、この場合のアドレスは、「別名」なのでしょうか? ブラウザでは見られるのだから、なにか方法があると思いますが、 その方法がわかりません。 ASHさんのスクリプトは、 http://ash.jp/perl/socket_http.htm にあります。 たとえば、 http://www.icn.ne.jp/~akatuki/furu0.htm http://www.icn.ne.jp/~furukawa/ は、このスクリプトでは読み取れません。 ここのプロバイダのサーバ上にあるHPは、全てそのようです。 また他のSPでも、このような所があります(少ないようですけど)。 こうなる理由と、対処方法(読み取る方法)をお願いします。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • vbaでの正規表現について教えてください

    「セルに入ってる値が数値ならA列からE列まで赤色にする」 を正規表現で行いたいのですがよくわかりません。 http://officetanaka.net/excel/vba/tips/tips38.htm を参考にしているのですが Sub Sample1() Dim RE, strPattern As String, r As Range Set RE = CreateObject("VBScript.RegExp") strPattern = "SUM\(" With RE .Pattern = strPattern ''検索パターンを設定 .IgnoreCase = True ''大文字と小文字を区別しない .Global = True ''文字列全体を検索 For Each r In ActiveSheet.UsedRange If .test(r.Formula) Then r.Interior.ColorIndex = 3 Next r End With Set RE = Nothing End Sub を、どう改造すれば、私のやりたい事になるのでしょうか? 【1】 まずstrPattern で、「数値ならば」はどうやればいいでしょうか? 【2】 次にtest(r.Formula)は、数式だからFormulaを使ってるのですよね? 数値を検索する場合はFormulaを何に変えればいいでしょうか? 【3】 最後に、 r.Interior.ColorIndex = 3はそのセルだけの色を変えるのですよね? A列からE列までにするにはどうすればいいでしょうか? 例えば A3セルに「1」が、A6セルに「3」が入っていたら、 A列からE列まで赤色にしたいです。

  • 日本語のエンコード

    日本語 秘華を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 になるにはどのようにすべきですか よろしくお願いします。

    • ベストアンサー
    • PHP