絵文字にマッチさせる正規表現

#Shift_JIS体系におけるコード
my $ascii = '[\x00-\x7f]'; #ASCIIと制御文字
my $two_bytes = '[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]'; #漢字
my $h_katakana = '[\xa0-\xdf]'; # 半角カタカナ

#絵文字コード正規表現
my $docomo = '(?:(?:\xf8[\x9f-\xfc])|(?:\xf9[\x40-\x49\x50-\x52\x55-\x57\x5b-\x5e\x72-\xfb]))';
my $ez = '(?:(?:[\xf3\xf6\xf7][\x40-\xfc])|(?:\xf4[\x40-\x8d]))';
my $voda = '\x1b\x24[GEFOPQ][\x21-\x7a]*\x0f'; #少々簡略

if ($str =~ m/^(?:$ascii|$two_bytes|$h_katakana)*?(?:$docomo|$ez|$voda)/){
    print "emoji matched";
} else {
    print "emoji not matched";
}

以下参考
http://209.85.141.104/search?q=cache:GiUKgEYWijsJ:hole.sugutsukaeru.jp/archives/15/3+perl+%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE+%E7%B5%B5%E6%96%87%E5%AD%97&hl=ja&ct=clnk&cd=8&gl=jp