正規表現の定義場所
2007/09/11
perlのリハビリ開始。
どう書く.orgの問題を考えてみました。
#!perl use strict; use warnings; sub extract_info { my $content = shift; while (my ($name, $is_hidden, $size, $ext, $rest) = $content =~ m{ ([[:alpha:]]+) (-hidden)? (-big | -normal | -small)? \. ([[:alpha:]]+) (.*) \z }msx) { $size ||= '-normal'; printf "name:'%s', ext:'%s', size: %s hidden: %s\n", $name, $ext, substr($size, 1), $is_hidden ? 'True' : 'False'; $content = $rest; } } extract_info do {local $/; <>};
なるべく、Perlベストプラクティスで教わった通りに(記憶をたどって)書いてみました。
x修飾子で、正規表現をわかり易く書けるのはいいんですが、パターンを定義する部分がここまで広がってくると、別の場所に定義したいんですが、やり方がわからなかった。コンパイルエラーが取れませんでした。
具体的には、別の場所で $pattern に正規表現オブジェクトを格納して、whileの中ではそれを使えばスッキリするのに。。。
my $pattern = m{ ([[:alpha:]]+) (-hidden)? (-big | -normal | -small)? \. ([[:alpha:]]+) (.*) \z }msx;
while側の書き方がわかりませんでした。コンパイルエラーが取れませんでした。
パターンを別の場所で定義する方法って、ベストプラクティスに載ってたかな?
追記 20070912
Perlベストプラクティス見なおしたら、別の場所で定義する方法は、たくさん書いてありました。qr でした。全然知識として残ってないことに、悲しくなりました。
#!perl use strict; use warnings; my $NAME = my $EXT = qr{ [[:alpha:]]+ }xms; my $HIDDEN = qr{ -hidden }xms; my $SIZE = qr{ - (?: big | normal | small) }xms; sub extract_info { my $content = shift; while (1) { $content =~ m{ ($NAME) ($HIDDEN)? ($SIZE)? \. ($EXT) }gxms or last; printf "name:'%s', ext:'%s', size: %s hidden: %s\n", $1, $4, substr($3 || '-normal', 1), $2 ? 'True' : 'False'; } } extract_info do {local $/; <>};
$1とかを使っていることが、気に入らないです。
ベストプラクティスや、http://www.perlmonks.org/?node_id=630328 に書いてあるように、\G とgcフラグの組み合わせを試してみたけど、動かないし、説明を読んでも理解できないので、上の形になりました。