KAIHATSUGIKEN GROUP
*************************************************************************************:
15 例題
****************
UNIXのwcコマンドは行数、単語数、バイト数、ファイル名をプリントします。
wcの出力から行数と単語数を取り出し1行あたりの平均単語数を計算するプログラムを
考えます。
while(<>){
chomp;
print$_;
if(/(\d+)\s+(\d+)/){
$line=$1;
$word=$2;
$words_per_line=$word$/$line;
printf("\t%.2f words/line",$words_per_line);
}
print"\n";
}
正規方言で最初の数(行数)と次の数(単語数)を取り出し、$lineと$wordに代入します。
取り出したのは文字列ですが自動的に数に変換されるのでそのまま式の中で使えます。
1行あたりの単語数を計算したら、それをプリントします。
小数点以下第2位までの形式でプリントするためにprintfを使っています。
実行すると
77 238 1683 perl5.003/embed.pl 3.09 words/line
270 307 2170 perl5.003/keywords.pl 1.14 words/line
137 439 3207 perl5.003/minimod.pl 3.20 words/line
648 2544 15613 perl5.003/opcode.pl 3.93 words/line
1132 3528 22673 total 3.12 words/line
となります。
************************************************************************
英語の名詞を入力するとその複数形をプリントするプログラムを作ってみます。
複数形を作る規則は簡単に次の規則になると思います。
1 sで終わる名詞はesをつける
2 子音とyで終わっている名詞はyをiに変えてesをつける
3 その他はsをつける
プログラムを簡単にするために単語のみを入力し前後によけいな文字は入力しないものとします。
use English;
while(<>){
chomp;
if(/s$/){
print$_,"es\n";
}elsif(/[^aiueo])y$/){
print$prematch,$1,"ies\n";
}else{
print$_,"s\n";
}
}
まず、「/s$/」でs で終わっているかを調べます。
s で終わっていたら、入力された単語とes をプリントします。
子音はaiueo以外ということにします。
そうすると「/(^aiueo]y$/」で子音とyで終わっているかどうかが調べられます。
この場合はyで終わっているかどうかが調べられます。
この場合はyの前までをプリントしてiesをプリントします。
yの前までプリントするには $prematch と $1をプリントすればOKです。
実行すると
bus ユーザー入力
buses
city ユーザー入力
cities
boy ユーザー入力
boys
book ユーザー入力
books
となります。
*********************************