ようこそゲストさん

Magical Diary, beta version

[Perl] Perl 5.9.5変更点 (の一部)

2007/07/25 21:32 HIRATA Yasuyuki

Perl v5.9.4 - v5.9.5間の変更点で気になったところをメモ。(元ネタはv5.9.5のperldelta) v5.9.x は開発版のため、安定版で利用できるまではしばらくかかる。(v5.10 で実装?)

非互換

汚染とprintf
Taint mode (汚染チェックモード) で動作する場合、printf/sprintfの書式指定文字列に汚染されたデータはNG。
undefとシグナルハンドラ
"undef $SIG{FOO}", "delete $SIG{FOO}" は "DEFAULT" の代入と等価になった。
仮想ハッシュは取り除かれた
仮想ハッシュ (pseudo hash) って何だ? と思ったら配列をハッシュっぽくアクセスする機構らしい。いらないな。
バイトコードコンパイラと perlcc は削除
信頼性と人的資源の問題らしい。

正規表現

再帰的なパタン
"(??{})" 構文を使用せず、再帰的なパタンを記述可能になる。後方参照して使えるので嬉しい。入れ子になった対応する山括弧にマッチさせるには下記の通り:
/
 ^                      # 行の開始
 (                      # 取込領域1の開始
    <                   #   開き山括弧にマッチ
    (?:                 #   以下のいずれかにマッチ:
        (?>             #     このグループ内でバックトラックを発生させない
            [^<>]+      #       山括弧以外の文字が1文字以上
        )               #     無バックトラックグループの終了
    |                   #     ... または ...
        (?1)            #     取込領域1の呼び出して再実行
    )*                  #   0回以上。
    >                   #   閉じ山括弧にマッチ
 )                      # 取込領域1の終了
 $                      # 行の終了
/x
PCREの実装とは少々異なるので注意とのこと。
名前付きの取込領域
$1 のように数字でアクセスする時代は終わった。(?<name>regex) でマッチさせた部分は \k<name> または $+{name} で参照することは出来る。例:
s/(?<letter>.)\k<letter>/$+{letter}/g
同一の取込領域名を複数個所に付けた場合、%+ の代わりに %- を利用する。これは値として配列へのリファレンスをもち、その配列にはマッチした文字列がそれぞれ含まれている。
© 2007 HIRATA Yasuyuki <yasu@asuka.net>, all rights reserved