結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

フリップフロップ

フリップフロップのように働く演算子 .. が話題になっている。

演算子が状態を持っているというのがすごいよね。

while (<DATA>) {
    if (/^3/../^5/) {
        print;
    }
}
__END__
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999

実行結果です。/^3/がマッチした以降は/^3/../^5/は真であり続け、/^5/にマッチしたところで偽に戻る。…を繰り返す。

3333333333
4444444444
5555555555
3333333333
4444444444
5555555555
3333333333
4444444444
5555555555

追記:はてなブックマークid:z0racさんが""が既に状態を持っているのだが、そう云うことではない? と書かれていましたが、そうではないです。1つのループ中に複数の ..演算子を入れれば、個別に状態管理されていることが分かります。以下を見てください。

while (<DATA>) {
    if (/^3/../^5/) {
        print;
    }
    if (/c$/../f$/) {
        print "\t$_";
    }
}
__END__
1111111111a
2222222222b
3333333333c
4444444444d
5555555555e
6666666666f
7777777777a
8888888888b
9999999999c
1111111111d
2222222222e
3333333333f
4444444444a
5555555555b
6666666666c
7777777777d
8888888888e
9999999999f
1111111111a
2222222222b
3333333333c
4444444444d
5555555555e
6666666666f
7777777777a
8888888888b
9999999999c

実行結果です。個別に状態管理している様子が読み取れると思います。

3333333333c
        3333333333c
4444444444d
        4444444444d
5555555555e
        5555555555e
        6666666666f
        9999999999c
        1111111111d
        2222222222e
3333333333f
        3333333333f
4444444444a
5555555555b
        6666666666c
        7777777777d
        8888888888e
        9999999999f
3333333333c
        3333333333c
4444444444d
        4444444444d
5555555555e
        5555555555e
        6666666666f
        9999999999c