実に前回から1年半近く経ってしまったPerlの適当モジュール解説シリーズ。今回はLingua::JA::Foldでいっちょネタをこしらえてみます。
タイトル通り文字列の折り返しに使えるこのモジュール。しかも禁則処理までやってくれるという優れもの。CPANのモジュールページはこちら。
と言うわけでまずソース。
fold.pl:
use Lingua::JA::Fold qw(fold);
my $str=Encode::decode('shiftjis',<>);
$str = fold('text'=>$str,'length'=>40);
print Encode::encode('shiftjis',$str);
list.txt:
仮にすべてA4で揃えるとして。クリアファイルつきのバインダー(コクヨのラ-460B)だと1890円。これをDリングファイル(コクヨのフ-FD430B)とクリアファイル(コクヨのラ-380NMを2つ)だと1312円。後者だとポケットが20個になるので、さらにクリアファイルを1パック追加すると30パックで1690円。いずれも定価ですが、後者の方が安く上がるわけです。勿論バインダーなんかを別の会社の物とかダイソーの100円の物にすればもっと安くなりますが。
list.txtは当然改行なし。この2つのファイルを用意して
type list.txt | perl fold.pl
としてやると、
仮にすべてA4で揃えるとして。クリアファイルつきのバインダー(コクヨのラ-460
B)だと1890円。これをDリングファイル(コクヨのフ-FD430B)とクリアフ
ァイル(コクヨのラ-380NMを2つ)だと1312円。後者だとポケットが20個に
なるので、さらにクリアファイルを1パック追加すると30パックで1690円。いずれ
も定価ですが、後者の方が安く上がるわけです。勿論バインダーなんかを別の会社の物と
かダイソーの100円の物にすればもっと安くなりますが。
とこんな感じに「40文字で」折り返されます。おめーlist.txtが複数行に渡ってたらどうするんだというツッコミがあると思いますが、ま実際に使う時は適宜調整してください。
まぁお気づきになったとは思いますが、これだと全角だろうと半角だろうとどちらも1文字として扱うわけです。大体○○文字で折り返し、と言う場合は全角は2文字分、半角は1文字分で(あるいは全角1文字分半角0.5文字分で)計算して欲しい! という場合が多いと思います。でもご安心。このモジュールはその辺もきちんと考えられていまして、
$str = fold('text'=>$str,'length'=>40,'mode'=>'full-width');
とfold関数にmode引数を渡してやると、「全角で」文字数を数えるようになります。この場合は「全角で」40文字なので、仮に全て半角文字だった場合は80文字になります。
さらに。
$str = fold('text'=>$str,'length'=>40,'mode'=>'traditional');
としてやると、これに加えて禁則処理もしてくれるのです。
'mode'=>'full-width'の場合
仮にすべてA4で揃えるとして。クリアファイルつきのバインダー(コクヨのラ-460B)だ
と1890円。これをDリングファイル(コクヨのフ-FD430B)とクリアファイル(コクヨのラ-38
0NMを2つ)だと1312円。後者だとポケットが20個になるので、さらにクリアファイルを1パ
ック追加すると30パックで1690円。いずれも定価ですが、後者の方が安く上がるわけです
。勿論バインダーなんかを別の会社の物とかダイソーの100円の物にすればもっと安くな
りますが。
'mode'=>'traditional'の場合
仮にすべてA4で揃えるとして。クリアファイルつきのバインダー(コクヨのラ-460B)だ
と1890円。これをDリングファイル(コクヨのフ-FD430B)とクリアファイル(コクヨのラ-38
0NMを2つ)だと1312円。後者だとポケットが20個になるので、さらにクリアファイルを1パ
ック追加すると30パックで1690円。いずれも定価ですが、後者の方が安く上がるわけです。
勿論バインダーなんかを別の会社の物とかダイソーの100円の物にすればもっと安くなり
ますが。
4行目、後者は句点がきちんとぶら下げられている事がお分かりになると思います。この例では対象になるものがありませんでしたが、括弧なんかにもきちんと対応してくれるようです。
ちなみにCPANのページにも書いてあるとおり、関数に渡す文字列はutf8フラグのついた文字列でないと駄目だそうです。fold.plの2行目で標準入力をフラグ付きutf8に、4行目で$strをshiftjisに変換しているのはそのためです。
コメント