- 2007/07/24 Tue
-
今日の日付は数字の並び的にどうも、なにか、こう、しっくりするものがあると思ったら誕生日だったわけですが、それはそれとして。いつもと変わらず肉まんをかじりながらてくてく駅へと。
Perl覚え書き。
マッチ数について考えてみる。$_ = "fooFooFOO"; print /foo/gi; # fooFooFOO
リストコンテキストだとマッチ文字列。$_ = "fooFooFOO"; print scalar /foo/gi; # 1
スカラコンテキストだとマッチ結果。$_ = "fooFooFOO"; @foo = /foo/gi; print @foo; # fooFooFOO print $#foo; # 2 print scalar @foo; # 3
配列をスカラコンテキストとして評価すればマッチ数。
一時変数を省略するにはscalarのリストコンテキスト版が欲しいところだけれど、ないらしい。$_ = "fooFooFOO"; print scalar map 0, /foo/gi; # 3 print scalar map //, /foo/gi; # 3 print scalar map '', /foo/gi; # 3 print scalar map undef, /foo/gi; # 3 print scalar map{0} /foo/gi; # 3 print scalar map{//} /foo/gi; # 3
ので、mapで代用してみたりとか。$_ = "foobar"; s/(\w)(o*)(\w*)/"$1o*".(scalar map 0, $2=~\/o\/g).$3/eg; print; # fo*2
でも、置換でマッチ数を使用しようとすると途中でメモリ変数がクリアされてしまったりとか。$_ = "foobar"; s/(\w)(o*)(\w*)/"$1o*".do{scalar map 0, $2=~\/o\/g;}.$3/eg; print; # fo*2bar
ので、doを使ってスコープをずらしたりとか。 overflow:autoの使用回数が増えてきたのでとりあえず変換対応してみたりなんだり。