フリップフロップ

フリップフロップRubyでやろうと思ったのですが、何だか汚くなってしまいました。

DATA.each do |s|
  if /^3/.match(s)../^5/.match(s)
    puts s
  end
end
__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

実行結果です。

3333333333
4444444444
5555555555
3333333333
4444444444
5555555555
3333333333
4444444444
5555555555

何で↓だとうまくいかにゃいのかにゃー。

DATA.each do |s|
  $_ = s
  if /^3/../^5/
    puts s
  end
end
__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

追記:
yowaさんから教えていただきました。ありがとうございます。Regexp#~を使えば、明示的に変数 $_ の値との間でのマッチをとれるようです。..演算子を使ったときは$_との暗黙的なマッチはできないらしい、とのこと。

DATA.each do |s|
  $_ = s
  if ~/^3/..~/^5/
    puts s
  end
end
__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