pluralize
英単語の複数形を作ったり、単数形に戻したりします。
ruby on railsのpluralizeを参考にperlに移植してみました。
>irb irb(main):001:0> require "active_support" => true irb(main):002:0> "child".pluralize => "children" irb(main):003:0> exit
sub pluralize { my $s = shift; return $s if ($s =~ s/^(ox)$/$1$2en/i); # ox return $s if ($s =~ s/([m|l])ouse$/$1ice/i); # mouse, louse return $s if ($s =~ s/(matr|vert)ix|ex$/$1ices/i); # matrix, vertex, index return $s if ($s =~ s/(x|ch|ss|sh)$/$1es/i); # search, switch, fix, box, process, address return $s if ($s =~ s/([^aeiouy]|qu)ies$/$1y/i); return $s if ($s =~ s/([^aeiouy]|qu)y$/$1ies/i); # query, ability, agency return $s if ($s =~ s/(hive)$/$1s/i); # archive, hive return $s if ($s =~ s/(?:([^f])fe|([lr])f)$/$1$2ves/i); # half, safe, wife return $s if ($s =~ s/sis$/ses/i); # basis, diagnosis return $s if ($s =~ s/([ti])um$/$1a/i); # datum, medium return $s if ($s =~ s/(p)erson$/$1eople/i); # person, salesperson return $s if ($s =~ s/(m)an$/$1en/i); # man, woman, spokesman return $s if ($s =~ s/(c)hild$/$1hildren/i); # child return $s if ($s =~ s/(buffal|tomat)o$/$1$2oes/i); # buffalo, tomato return $s if ($s =~ s/(bu)s$/$1$2ses/i); # bus return $s if ($s =~ s/(alias)/$1es/i); # alias return $s if ($s =~ s/(octop|vir)us$/$1i/i); # octopus, virus - virus has no defined plural (according to Latin/dictionary.com), but viri is better than viruses/viruss return $s if ($s =~ s/(ax|cri|test)is$/$1es/i); # axis, crisis return $s if ($s =~ s/s$/s/i); # no change (compatibility) return $s if ($s =~ s/$/s/); } sub singularize { my $s = shift; return $s if ($s =~ s/(matr)ices$/$1ix/i); return $s if ($s =~ s/(vert)ices$/$1ex/i); return $s if ($s =~ s/^(ox)en/$1/i); return $s if ($s =~ s/(alias)es$/$1/i); return $s if ($s =~ s/([octop|vir])i$/$1us/i); return $s if ($s =~ s/(cris|ax|test)es$/$1is/i); return $s if ($s =~ s/(shoe)s$/$1/i); return $s if ($s =~ s/(o)es$/$1/i); return $s if ($s =~ s/(bus)es$/$1/i); return $s if ($s =~ s/([m|l])ice$/$1ouse/i); return $s if ($s =~ s/(x|ch|ss|sh)es$/$1/i); return $s if ($s =~ s/(m)ovies$/$1$2ovie/i); return $s if ($s =~ s/(s)eries$/$1$2eries/i); return $s if ($s =~ s/([^aeiouy]|qu)ies$/$1y/i); return $s if ($s =~ s/([lr])ves$/$1f/i); return $s if ($s =~ s/(tive)s$/$1/i); return $s if ($s =~ s/(hive)s$/$1/i); return $s if ($s =~ s/([^f])ves$/$1fe/i); return $s if ($s =~ s/(^analy)ses$/$1sis/i); return $s if ($s =~ s/*1."\n"; print singularize( pluralize("test"))."\n"; print singularize( pluralize("child"))."\n"; print singularize( pluralize("man"))."\n";
*1:a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/$1$2sis/i); return $s if ($s =~ s/([ti])a$/$1um/i); return $s if ($s =~ s/(p)eople$/$1$2erson/i); return $s if ($s =~ s/(m)en$/$1an/i); return $s if ($s =~ s/(s)tatus$/$1$2tatus/i); return $s if ($s =~ s/(c)hildren$/$1$2hild/i); return $s if ($s =~ s/(n)ews$/$1$2ews/i); return $s if ($s =~ s/s$//i); } print pluralize("ox")."\n"; print pluralize("test")."\n"; print pluralize("child")."\n"; print pluralize("man")."\n"; print singularize( pluralize("ox"