初めてのPerl 第8章

練習問題の回答をメモ。正規表現って奥が深そう。

ex08-1
#!/usr/bin/perl
use strict;

while (<>) {
    chomp;
    # 正しくは:/\b(fred|wilma)\s+flintstone\b/
    if (/(fred|wilma)\s+flintstone/) {
        print "Matched: $`<$&>$'\n";
    } else {
        print "No match.\n";
    }
}

「ワードにマッチする」っていう条件を見逃してた。

ex08-2

「/^\b[\w.]{1,12}\b$/」という正規表現をよく理解していなかった。文字クラスの中ではドット「.」は通常の文字を表す。また、ドットはワードには含まれないから、この例では文字列の先頭と末尾にはドットを置けないことに注意。

ex08-3
#!/usr/bin/perl
use strict;

while (<>) {
    chomp;
    # 間違い:/^\$[^0-9]\w*$/
    if (/^\$[A-Za-z_]\w*$/) {
        print "Matched: $`<$&>$'\n";
    } else {
        print "No match.\n";
    }
}

[^0-9]では条件がゆるすぎ。これだと[0-9]以外にマッチしてしまう。

ex08-4
#!/usr/bin/perl
use strict;

while (<>) {
    chomp;
    # 正解は:/\b(\w+)(\s+\1)+\b/
    if (/\b(\w+)(\s+\1\b)+/) {
        print "Matched: $`<$&>$'\n";
    } else {
        print "No match.\n";
    }
}

簡単そうに見えて、考えてみるとちょっと面倒だった。

反省点

文字クラス内では記号の意味が変わってくることに気をつけよう。
ドットはワードには含まれないよ。
ワード境界アンカーを指定し忘れていないか確認しよう。