kzhr's diary

ad ponendum

Perlのregex?

正規表現でのメールアドレスチェックは見直すべき – ReDoS – yohgaki's blogを見て,Perl 5だとどうなるんだらうと書いてみた。ちなみに,perl 5.18.2とruby 2.0.0p648。

use strict;
use warnings;
use feature qw/ say /;
use Time::HiRes qw/ time /;

for my $n (5 .. 12) {
  my $s = "username\@host" . ".abcde" x $n . ".";
  my $start = time();
  say $s;
  say $s=~ /\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/ms;
  say(length($s) . ': ' . (time - $start));
}

結果としては,

time perl test.pl

44: 0.000130891799926758

50: 0.0001068115234375

56: 0.000277042388916016

62: 0.000208139419555664

68: 0.000213861465454102

74: 0.000242948532104492

80: 0.00024104118347168

86: 0.000189065933227539

real	0m0.028s
user	0m0.017s
sys	0m0.008s
time ruby test.rb
nil
"44: 0.068262"
nil
"50: 0.385222"
nil
"56: 1.905355"
nil
"62: 9.483776"
nil
"68: 46.55787"
nil
"74: 230.308585"
nil
"80: 1156.772055"

real	24m5.527s
user	23m57.498s
sys	0m2.997s

といったところ。既知の結果ではありとくに云ふべきことないけれど,試してみるとほんとにぜんぜん違ふのは驚いた。