Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Can't find Unicode property definition

Perlスクリプト実行時に

Can't find Unicode property definition "=" at ./hoge.pl line 92, <> line 4016.

と言われた。


確かに、このスクリプトの 92 行目にある正規表現:

  if (m{^http://w+\.google\..+?/\w+?\?.*?\b(?:as_)?(?:ep)?q=([^&]+)}) {

には "=" が含まれている。
でも、これをコマンドラインからワンライナーで実行しても何もエラーが出ない。


CPAN のドキュメントでは、正規表現中で "\p" を使おうとしているはずだから、それをエスケープしろとか言っている。
http://search.cpan.org/%7Ergarcia/perl-5.9.3/pod/perldiag.pod#Can%27t_find_Unicode_property_definition_%22%s%22
でも "\p" なんてこの正規表現の中にはないし……


……実は 92 行目じゃなくて、その下の方(98 行目でした)にある

  } elsif (m{^http://search.yahoo\..+?/search\?\p=([^&]+)}) {

という正規表現が問題だった。これは誤りで、正しくは以下:

  } elsif (m{^http://search.yahoo\..+?/search\?p=([^&]+)}) {

この "\p" が悪さをしていたというわけ。


教訓は……

  • if-elsif-else の条件文中にエラーがある場合、どの行にエラーがあっても、報告される行は "if" の行だったりすることがあるらしい。
  • "Can't find Unicode property definition XXXX at ..." というエラーが出た場合、どの行で報告されているかは関係なしに "\p" で検索をかけろ。