電子書籍の厳選無料作品が豊富!

お世話になります。

Perl正規表現プログラムで、
s置換演算子の末尾に、
カンマと丸カッコでスカラ変数を囲んで、
存在している箇所

たとえば、
s/あいうえお/($hensu = $&)
=~ tr{ABC}{abc}, ($hensu)
=~ s{123}{123}, ($hensu)
/eg;

のような正規表現であれば、
上記のtr置換演算子や、s置換演算子それぞれの末尾に、
「 , ($hensu) 」
として、カンマと丸カッコでスカラ変数を囲んで、
存在している箇所は、
どのような意味があるのでしょうか?

以上になります。

PS:
ネット上や正規表現の本などを読んでも、
上記したような、
カンマと丸カッコでスカラ変数を囲んでいる
パターンの解説を、
見つけられなかった為、
ご質問させていただきました。
ご存じの方がいらっしゃいましたら、
教えてください。
よろしくお願いします。

A 回答 (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.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

おっしゃる通り、このような書き方は、私も自分ではしないので、
今回丁寧に解説していただき、あと他の方々のご回答とあわせて、
ようやくこのサンプルの意味を理解することが出来ました。

それと、$&が正規表現の効率を悪くする点も教えていただき、
了解致しました。

きめ細かい解説をいただきまして、
本当にありがとうございました。

お礼日時:2012/08/08 02:56

括弧の意味は、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 の意味を調べてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

s/正規表現/式/e の意味自体は、
ネット上や本で調べていて、
式で置換出来ることは存じておりましたが、
Perlの「カンマ演算子」というものの存在自体を、
知らなかったため、
解析出来ていませんでした。
(Perlを初めて利用中であり、
 今回は「正規表現」だとばかり思い込んでいて、
 「正規表現」に関する本やネット情報ばかりを調べていた為・・・)

教えていただけましたおかげて、
ようやく納得出来ました。
本当にありがとうございました。

お礼日時:2012/08/08 02:48

ん~, なんでそんなところで区切っちゃうんだろ.... せめて


s/あいうえお/($hensu = $&) =~ tr{ABC}{abc},
($hensu) =~ s{123}{123},
($hensu)/eg;
くらいにしようよ. とはいえこの「($hensu)」のかっこに意味があるようには見えない.

あ, s/// のオプション e を知らないと, 何をやってるかさっぱりわからんね.
s/あれ/これ/e
で「あれ」にマッチした部分を「『これ』を評価した結果」で置き換えます.

この回答への補足

早々にご回答ありがとうございます。
おっしゃる通りなんですよね。

実は、この正規表現の例は、
私が、既存のサンプルPerlプログラム(正規表現)を解析中に、
上記質問箇所だけが、
意味が不明だったので、
今回、ご質問させていただいています。

どなたか、
s置換演算子の末尾に対して、
,(カンマ) ($hensu)
を追加している意味(技術的な・・・)として、
なにか想定できそうなことを、
お気づきの方がいらっしゃいましたら、
ぜひヒントだけでもアドバイスいただければ幸いです。

以上、よろしくお願いします。

補足日時:2012/08/07 18:41
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

最初、私が理解出来ておらず、
その後、いろいろな方々からの追加での回答を見て、
ようやくおっしゃっていただいていた意味を
理解出来ました。
本当にありがとうございました。

お礼日時:2012/08/08 02:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!