kaibun.pl

30分プログラム、その33。

正規表現で回文判定。厳密な正規表現(正則言語)じゃ無理だけど、Perlの使う強力な拡張された正規表現ならできる。

$ perl kaibun.pl noon
OK
 
$ perl kaibun.pl eye
OK
 
$ perl kaibun.pl mzp
NG
 
$ perl kaibun.pl ごまたまご
OK
 
$ perl kaibun.pl みずの
NG
use warnings;
use strict;
use utf8;
use Encode;
 
@ARGV > 0 or die "too few arguments";
my $target = decode('UTF-8',$ARGV[0]);
 
if($target =~ m/^(?: (.*) # 前半
                     (??{quotemeta reverse $1 }) # 後半
                  | 
                     (.*) # 前半
                     . # 真ん中
                     (??{quotemeta reverse $2 }) # 後半
                 )
              $/x)
{
    print "OK\n";
}else{
    print "NG\n"
}
  • 奇数文字の回文と、偶数文字の回文で処理を変えている
  • 日本語に対応されるのにすごい苦労した。use utf8とdecodeがポイント
  • (??{...})だと中にPerlのコードが書けて、正規表現を生成できる
  • これを正規表現と呼ぶのはさすがにダメだろ。いいかげん別の呼び名を考えるべきじゃね?