わいえむねっと

Contents
Categories
Calendar
2007/07
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.062 sec
Chashed: -
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の使用回数が増えてきたのでとりあえず変換対応してみたりなんだり。