やりたいことはシンプルなのに、めんどい…

Perlで、全角数字を半角数字に変換したいのです。


すぐにできるとたかをくくっていましたが、意外とめんどくさい。他の箇所でEncode.pmを使っているのでEncodeのみで記述したかったのですが、残念ながらできなさそう。で、Jcodeを使えばよさそうなのですが、EUC-JPじゃないと全角文字がうまく扱えないのに、Shift_JISが使われています。がっでむ!


あまり時間かけるのも何なので、とりあえずやっつけ仕事的に以下のようなサブルーチンを定義しました。

use Encode;
use Jcode;

sub tr_z2h {
  my ($ref_str) = @_;
  my $zen = '0-9';
  my $han = '0-9';

  # 変換前処理(Jcode.pm の tr はEUC-JPを前提としているため)
  Encode::from_to($$ref_str, 'Shift_JIS', 'EUC-JP');
  Encode::from_to($zen, 'Shift_JIS', 'EUC-JP');
  Encode::from_to($han, 'Shift_JIS', 'EUC-JP');

  # 全角⇒半角変換
  $$ref_str = jcode($$ref_str)->tr($zen, $han);

  # 変換後処理
  Encode::from_to($$ref_str, 'EUC-JP', 'Shift_JIS');
}

もっとスマートなやり方、誰か知らないかなぁ…と投げかけてみる。




ちなみに、どこでこういう問題が出てきたかというと、例のWalkerplusGoogle Calendarに登録するというやつ。


2011 津花火大会(三重県・津市)| 花火大会 花火カレンダー - Walkerplus第56回鳥羽みなとまつり(三重県・鳥羽市)| 花火大会 花火カレンダー - Walkerplusが拾われてなかったので原因を探ってみると、この2つのページだけ何故か全角数字が混じっていましたよorz


この修正を施して、あとはいくつか元ページの仕様変更に対応。

  • 開始時間しか記載されていないものは、1時間後に終了すると仮定
  • 「花火」という文字をセットして検索*1

*1:今まで検索フォームに空文字Submitで花火大会一覧を取得していたけれど、空文字だとエラーになるようになったので