第9章 正規表現の利用法 練習問題

GWだけどがんばります。

1. $whatという変数に入っている正規表現が三回現れるようなパターンを書く

まずは、まんまと罠にひっかかりました。

/$what{3}/

で、$what='test';などとしても、"testtesttest"にマッチしない。{3}がtに結合しちゃってるんだからそりゃそうだな。だから、

/($what){3}/

としました。解答通りになりました。

2. ファイルperlfunc.podの中で、=itemで始まりその次にPerl識別子が現れる行を見つけ、その識別子を表示するプログラムを作る

perlfunc.podはシステムによって場所が変わるらしい。次のコマンドで調べれるとのことなので、

$ perldoc -l perlfunc
/System/Library/Perl/5.8.6/pods/perlfunc.pod

となった。Mac OS X Tiger使ってます。

このファイルの中には、

=item Numeric functions
=item Functions for real @ARRAYs

というような行が含まれています。この問題では、要は、こんな文字列を見つけて、=itemの次の識別子を取り出して、

Numeric
Functions

というように出力できれば良い。

それで、うちが書いたコードはこれ。

while(<>) {
    print if s/^=item\s+([a-zA-Z_]\w*).*$/$1/;
}

我ながらPerl的すてきおまじないコードが書けた気がする。<>で一行づつ読んで、s///の置換が成功したら、置換結果を表示。

解答では、置換は使わずに、マッチした行だけ$1を表示するようにしていた。うーん、やはり置換の方が単にマッチさせるより重そうな処理だし、うちの方法は無駄が多いかしらね。

3. 2の問題で、現れた識別子のうち3回以上現れたものだけを表示するプログラムを書く

識別子の出現数をハッシュに格納しました。2の解答も参考に。

use strict;

my %names;

while(<>) {
    if (/^=item\s+([a-zA-Z_]\w*).*$/) {
        $names{$1} += 1;
    }
}

for my $name (sort keys %names) {
    if ($names{$name} >= 3) {
        print "$name\n"
    }
}

初めてのPerl

初めてのPerl

  • 作者: ランダル・L.シュワルツ,トムフェニックス,Randal L. Schwartz,Tom Phoenix,近藤嘉雪
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2003/05
  • メディア: 単行本
  • 購入: 15人 クリック: 474回
  • この商品を含むブログ (294件) を見る