小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

「1 while s///」とはなにか?

昨日、ご紹介したスクリプトの中に以下があったと思います。

 1 while $wk =~ s/\([^()]*\)//g; # 関数系を弾く

これは、SQLのSelect文の選択項目のところに以下のような関数が使用された場合、それ弾いています。

select MAX(ISNULL(aa,'0')) AS bb from aabb_tbl 

「1 while s///」の説明は、以下にありました。

ここで,「1 while s///」というのは,「while (s///) {1}」と書くのと等しいです。
置換(s///)は成功すれば置換した数(この場合1)を,失敗すれば0を返すので,上の例では置換が成功する限り{ }の中の「1」を実行し続けます。実際には「1」は実行しても何も起こりません。
なので,「1 while s///」は置換ができる限りはそれを続け,置換ができなくなればそれで終了する,という関数になります。

http://www.bi.a.u-tokyo.ac.jp/~mizuki/personal/Research/PerlOneLiner.html

たとえば、以下の場合などに使います。

入れ子を許した括弧内を削除する
1 while $str =~ s/\([^()]*\)//g;

http://www.din.or.jp/~ohzaki/regex.htm#RemoveNestedParen

まず、正規表現括弧パターン「\([^()]*\)」をNULL置換した後に、whileで再帰的にそれを行い、マッチしなくなるとwhileを抜ける。