「初めてのPerl」 9章 (正規表現の利用法)

東京に来てB2Bの通信ミドルウェアの講習会に参加しているのですが、淡々とした説明があまりにも退屈ですごーく眠いbonlifeです。演習を散りばめたら良いのに今日は講義Onlyですよ…。ということで、帰ってきてPerlの復習をしています。演習問題メモもついに9章「正規表現の利用法」です。

  • m//を使ったマッチング
  • オプション修飾子
  • 結合演算子
  • マッチ変数
  • s///を使った置換
  • split演算子
  • join関数

といった感じの内容がサラッと説明されています。エスケープを積み重ねて大文字、小文字を自由自在に操れるのにはビックリしました。(148,149ページ参照)ということで、9章の演習問題のbonlife的解答です。
ex9-1.pl

  • $whatに入っているものが3回連続して現れるものいマッチするようなパターンを書く
  • もし$whatがfred|barneyだったら、fredfredbarneyなどにマッチすること
#! perl -w
use strict;
my $what = 'fred|barney';
print "Please input some words : \n";
while (<>) {
	chomp;
	if (/($what){3}/) {
		print "Matched : | $`<$&>$' |\n";
	} else {
		print "No match.\n";
	}
}

出力結果は以下の通り。

ex9-1.pl
Please input some words :
fred
No match.
barney
No match.
fredfredbarney
Matched : | <fredfredbarney> |
barneyfredfred
Matched : | <barneyfredfred> |
barneybarneybarney
Matched : | <barneybarneybarney> |
^Z

解答例を見て気づいたことは特になし。同じ。
ex9-2.pl

  • perlfunc.podファイルの中を探して、=itemで始まり、その次に何個かの空白文字が続き、さらにPerl識別子名(英数字と下線で構成されるが、先頭は数字以外)が続く行を見つけ出すプログラムを書く
  • ダイヤモンド演算子を使う
  • プログラムが識別子名を見つけるたびに表示
#! perl -w
use strict;
while (<>) {
	if (/^=item\s+([A-Z_]\w*)/i) {
		print "$1\n";
	}
}

出力結果は以下の通り。

ex9-2.pl "C:\Perl\lib\pod\perlfunc.pod"
Functions
Regular
Numeric
(中略)
write
write
y

解答例を見て気づいたことは特になし。同じ。
ex9-3.pl

  • 問題2のプログラムを改造して、=item行に3回以上現れた識別子名だけを、現れた回数とともに表示させる
#! perl -w
use strict;
my %word_count;
while (<>) {
	if (/^=item\s+([A-Z_]\w*)/i) {
		$word_count{$1} += 1;
	}
}
foreach my $word ( sort keys %word_count ) {
	if ( $word_count{$word} >= 3 ) {
		print "\"$word\" appears $word_count{$word} times in \"$0\".\n";
	}
}

出力結果は以下の通り。

ex9-3.pl "C:\Perl\lib\pod\perlfunc.pod"
"Functions" appears 9 times in "C:\test\perl\ex9-3.pl".
"Keywords" appears 4 times in "C:\test\perl\ex9-3.pl".
"chomp" appears 3 times in "C:\test\perl\ex9-3.pl".
(中略)
"syswrite" appears 3 times in "C:\test\perl\ex9-3.pl".
"use" appears 5 times in "C:\test\perl\ex9-3.pl".
"write" appears 3 times in "C:\test\perl\ex9-3.pl".

解答例を見て気づいたことは特になし。ほぼ同じ。英語の表現や3個以上の表現が違うぐらいですね。
という感じで9章の演習問題を解きましたが、すでに17章まで読み終わっているのです。演習問題もサクサク解いて一巡目を早めに終わらせておこうと思います。とか言いつつ、Rubyの勉強も始めちゃいます!本も買っちゃいましたので。

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング