PerlでCamelize/DeCamelize

sub camelize {
    (my $s = shift) =~ s/(?:^|_)(.)/\U$1/g;
    $s;
}

sub decamelize {
    my $s = shift;
    $s =~ s/(_)?((?:[A-Z](?![^A-Z]))+|[A-Z])/(pos($s)==0&&!$1?'':'_').lc($2)/ge;
    $s;
}

普通にString::CamelCaseとか使えばいい話なんですが,スクリプト中とかでわざわざuse CamelCaseするのもなあって時や,一回しかやらないのでベタ書きしてしまえって事もあるので,そういう時に使えばいいと思います.

String::CamelCaseの実装をコピペでもよいかなと思ったんですが,使いたいときにぱっと思い出せる程度に簡素化したかったので上のような感じにしてみたわけですが,decamelizeについては十分複雑ですね.あまり使う機会はないので気にしません.

一応String::CamelCaseのテストは全て通ってますが,挙動が完全に同じかは分かりません. あとString::CamelCaseよりちょっとだけ早いです.Camelizeを高速に行いたいシチュエーションって思いつきませんが.

$ perl -MBenchmark -MString::CamelCase -e'sub mycamelize { (my $s = shift) =~ s/(?:^|_)(.)/\U$1/g; $s } my $s="perl_is_extreamely_lovely_language"; Benchmark::cmpthese 10**5 => { "S::CC" => sub { String::CamelCase::camelize($s) }, "mycamelize" => sub { mycamelize($s) } }'
              Rate      S::CC mycamelize
S::CC      68493/s         --       -24%
mycamelize 90090/s        32%         --