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