- ベストアンサー
Perl正規表現s置換演算子の末尾にカンマについて
- Perl正規表現プログラムでs置換演算子の末尾にカンマと丸カッコでスカラ変数を囲んでいる理由について解説します。
- カンマと丸カッコで囲んでいる箇所は、スカラ変数を作成し、その値を後続の処理に渡すためのものです。
- このような書き方は、関数の引数として複数の値を渡す際に便利です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いや・・・あの No.1さんがもう全部説明してくれてるんだけど・・・ gは本質じゃないから s/<regex>/<replace>/e を考える. eをつけることで,<replace>を実行させる #じつは ee というオプションもある・・・ ということで, s/あいうえお/($hensu = $&) =~ tr{ABC}{abc}, ($hensu) =~ s{123}{123}, ($hensu) /eg; ・・・みにくいから s/あいうえお/ ($hensu = $&)=~ tr{ABC}{abc}, ($hensu)=~ s{123}{123}, ($hensu) /eg; ってのは,$_ の中の「あいうえお」にマッチした部分が $& にはいって それを $hensu に代入して tr して その結果の $hensu を s{} して, それを $hensu として評価させて 結果,$_ の「あいうえお」を$hensuの中身で置換する ってところかなー こんな書き方自分じゃしないからなー。。。 こんな書き方するよりも 順番に if なり何なりできちんと書いたほうが可読性があがるからいいと思う. ついでに・・・$& ってのは正規表現の効率をめっちゃ悪くするから注意 The use of this variable ($&のこと) anywhere in a program imposes a considerable performance penalty on all regular expression matches. To avoid this penalty, you can extract the same substring by using @-. Starting with Perl 5.10, you can use the /p match flag and the ${^MATCH} variable to do the same thing for particular match operations.
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
括弧の意味は、No1の回答にあるように、「意味なし」ですね。 ( 2 * 3 ) + 4 の括弧の意味と同じく、「あっても無くても機能は同じ」。 s/あいうえお/($hensu = $&) =~ tr{ABC}{abc}, ($hensu) =~ s{123}{123}, ($hensu)/eg; の、 ($hensu = $&) =~ tr{ABC}{abc}, ($hensu) =~ s{123}{123}, ($hensu) の部分は、正規表現では無いです。普通の式。カンマは普通にカンマ演算子です。 No1の方の指摘にある通り、s/正規表現/式/e の意味を調べてください。
お礼
ご回答ありがとうございました。 s/正規表現/式/e の意味自体は、 ネット上や本で調べていて、 式で置換出来ることは存じておりましたが、 Perlの「カンマ演算子」というものの存在自体を、 知らなかったため、 解析出来ていませんでした。 (Perlを初めて利用中であり、 今回は「正規表現」だとばかり思い込んでいて、 「正規表現」に関する本やネット情報ばかりを調べていた為・・・) 教えていただけましたおかげて、 ようやく納得出来ました。 本当にありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
ん~, なんでそんなところで区切っちゃうんだろ.... せめて s/あいうえお/($hensu = $&) =~ tr{ABC}{abc}, ($hensu) =~ s{123}{123}, ($hensu)/eg; くらいにしようよ. とはいえこの「($hensu)」のかっこに意味があるようには見えない. あ, s/// のオプション e を知らないと, 何をやってるかさっぱりわからんね. s/あれ/これ/e で「あれ」にマッチした部分を「『これ』を評価した結果」で置き換えます.
お礼
ご回答ありがとうございました。 最初、私が理解出来ておらず、 その後、いろいろな方々からの追加での回答を見て、 ようやくおっしゃっていただいていた意味を 理解出来ました。 本当にありがとうございました。
補足
早々にご回答ありがとうございます。 おっしゃる通りなんですよね。 実は、この正規表現の例は、 私が、既存のサンプルPerlプログラム(正規表現)を解析中に、 上記質問箇所だけが、 意味が不明だったので、 今回、ご質問させていただいています。 どなたか、 s置換演算子の末尾に対して、 ,(カンマ) ($hensu) を追加している意味(技術的な・・・)として、 なにか想定できそうなことを、 お気づきの方がいらっしゃいましたら、 ぜひヒントだけでもアドバイスいただければ幸いです。 以上、よろしくお願いします。
お礼
ご回答ありがとうございました。 おっしゃる通り、このような書き方は、私も自分ではしないので、 今回丁寧に解説していただき、あと他の方々のご回答とあわせて、 ようやくこのサンプルの意味を理解することが出来ました。 それと、$&が正規表現の効率を悪くする点も教えていただき、 了解致しました。 きめ細かい解説をいただきまして、 本当にありがとうございました。