「perl で trim(完全版)」や「ハッシュ変数に存在しないキーを指定した場合の値は何?」という記事をはてブで拝見しました。Perlでいかにtrimする(前後の空白を取り除く)か、という命題です。しかし、残念なことに、文字コードによってはこれでもまだ完全ではありません。
- モダンなPerlでは、プログラム内部では文字列の文字コードをUTF-8で扱い、必要に応じて入力時にデコード/出力時にエンコードする方法が一般的です。
- こうした常套句については、コードスニペットをコピペするより、CPANモジュールを出来るだけ使うと好ましいです。理由は「かなり使えるPerl正規表現のまとめ」の通り。今回の場合、
String::Utilのtrim()が使えます。
ということで、モダンにtrimする場合には、以下のように書けます。
use strict;
use warnings;
use utf8;
use String::Util qw(trim);
use Test::More;
# half-width space : 半角スペース
is trim(' foo'), 'foo' => 'half prefix'; # 接頭スペース
is trim('bar '), 'bar' => 'half suffix'; # 接尾スペース
is trim(' baz '), 'baz' => 'half circumfix'; # 接周スペース
# full-width space : 全角スペース
is trim(' foo'), 'foo' => 'full prefix';
is trim('bar '), 'bar' => 'full suffix';
is trim(' baz '), 'baz' => 'full circumfix';
# 両対応
is trim(' foo'), 'foo' => 'both prefix';
is trim('bar '), 'bar' => 'both suffix';
is trim(' baz '), 'baz' => 'both circumfix';
done_testing();
__END__
use utf8しつつUTF-8でテストスクリプトを保存することで、全角スペースも(trim()の中でも使われている正規表現である)\sに該当するようになります。
実際にアプリケーションで使う場合には、Encodeを使って外から来た文字列はdecode()して、外に出す文字列は(必要に応じて)encode()することになります。出力はアプリ作者側でどうにでも出来るので、特に指定する必要がない場合にはUTF-8のままで問題ないでしょう。日本の携帯電話向けには、Shift-JISなどと適宜変えることになります。入力側はEncode::Guess辺りで日和っておくといい感じです。
勿論、モダンな環境を使えない場合や、CPANモジュールが使えない場合(実際は「だが、私はCPANを使えない!」の通り、あまりないです)も多々あるわけで、そうした場合にはトラックバック先に挙げられているような手法を使うのが良いと思います。他にも、「PerlでTrimする!」という記事もあります。
コメントする