正規表現の定義場所

perlのリハビリ開始。

どう書く.orgの問題を考えてみました。

http://ja.doukaku.org/51/

#!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フラグの組み合わせを試してみたけど、動かないし、説明を読んでも理解できないので、上の形になりました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください