僕が好んで使っているPerlモジュール

僕が趣味や仕事で使ってるPerlモジュールを紹介します。逆に、使ったけどイマイチだったPerlモジュールも紹介しています。

# おすすめPerlモジュール

あまりよく分かってない人に説明するつもりで書いてますが、当の本人もあまり分かってないことがあるので容赦してください。

ちなみに僕のPerlスキルは下の中ぐらいです。いまだに分からないことだらけ。

## どんな案件にも絶対使う！

### Mojolicious

Webアプリを一からつくるときに、あれば便利なツールが全部つまってる。まずこのMojoliciousをインストールして開発をはじめる。

大きいプロジェクトから極小のプロジェクトまで、どんな案件にも使ってます。これがあるとないとでは雲泥の差。ないとヤル気が起きない。

ほかにも似たようなモジュールとしてAmon2などありますが、たぶんこのMojoliciousが一番ドキュメントが豊富。

おすすめドキュメントは・・

- 「PerlならサンプルコードPerl入門」のMojolicious入門
http://d.hatena.ne.jp/perlcodesample/20140319/1395203665
- Mojoliciousドキュメント 日本語訳 - GitHub
https://github.com/yuki-kimoto/mojolicious-guides-japanese/wiki

特に後者は情報が網羅されてるので、ひとまず導入初期はこのWikiを読むだけで99％困らない。

## エンコーディング

### Encode

文字コードの変換に使う定番モジュール。使わなかったことがないぐらい定番。

### Lingua::JA::Regular::Unicode

ひらがなをカタカナに変換したり、全角英数を半角にしたり、そういう系の変換をしてくれるモジュール。まあまあ使う。

## データベース

### Teng

DBIx::Class⇒DBIx::Skinnyと使ってきて、最終的にこのTengに落ち着いた。

できることが少ないので、下の中プログラマーでもけっこうスマートに使えます。しかも、高速。

ちなみにプラグインを使ったらページャとかもついてくる。僕が常用してるプラグインは以下。

- Teng::Plugin::Count
- Teng::Plugin::Pager
- Teng::Plugin::FindOrCreate

ちなみにページャは実装がData::Page互換らしいけど、total_entries()がついてない。最初けっこう『めんどくさー』と思うけど、案外ネックじゃなくすぐ慣れる。

ややこしいクエリを発行するときは、SQL::Makerを使うこともできるが、僕は_by_sql系のメソッドを使っています。

## 日付時間

### Time::Piece

DateTimeが遅いっていう情報をキャッチしてから使いはじめた。実際、速い、気がします。

ただ、環境によっては1970年～2038年までしか扱えない。つまり年齢を扱うのに難がある場合がある。僕はそういう場合、部分的にDateTimeを使っている。

### Time::Piece::MySQL

Tengから取得したdate型やdatetime型をTime::Pieceオブジェに変換するときに使っている。

ただ、CPANで配布されてるバージョンは、Time::Pieceの実装とは関係なく、1970年～2038年の扱いを完全に切り捨ててるので注意。ちなみに該当部分のロジックは超簡単なので、修正を待つより自分で対処する方が楽。

### Time::Seconds

Time::Pieceでの「1日」をONE_DAYとかって定数で書けるだけ。地味に便利なので使ってる。

ただ、ある意味期待どおりだけど、1月31日から「+ ONE_MONTH」すると3月2日とかって計算されるので分かって使わないとだめです。

## 画像処理

### Imager

Image::Imlib2の方が圧倒的に早いけど、GIF画像を出力できないのと、Exif情報を編集する方法が分からなかったので使わなくなった。

一方でこのImagerは、GIF出力できて良い。ただちょっと、というかImage::Imlib2と比べるとだいぶ、動作が重いのが難点。

### Imager::ExifOrientationとImager::Filter::ExifOrientation

今の時代にアップローダーを作ると、スマホで撮影された画像の向きが勝手に90度回転してることがある。そういうときにこのモジュールで回転を補正する。便利。

## HTTP関係

### LWP::Simple周辺モジュール

簡単に他サイトのページを取得したいとき、またはややこしいパラメータを指定してPOSTしたいときなど、下記4種類のモジュールを適当に組み合わせて使っている。

使い分けはほぼ気にしてないので、説明しろって言われても難しい。

- LWP::Simple
- LWP::UserAgent
- HTTP::Request
- HTTP::Request::Common

### Woothee

UAをみてロボットか？パソコンか？スマホか？といった判定をしてくれる。超便利。よく使う。

### WWW::Mechanize::Sleepy

人間がブラウザを操作してるかのようにブラウジングし、指定したWebサイトからレスポンスを受け取ってきてくれる。

「このページにアクセスして、テキストフォームにこれを入力して、2つ目のボタンをクリックしてくれ」とかって命令ができる。用途に注意。

ちなみにWWW::Mechanizeとの違いは、WWW::Mechanize::Sleepyだと連続アクセスする際にsleepしてくれるので相手方に優しい。

### Web::Scraper

上記のWWW::Mechanize::Sleepyで取ってきたHTMLを解析するときに使う。

最近ではChrome付属のデベロッパーツールで簡単にページ内要素のXPathを取れる時代なので、それを参考にHTMLから必要データだけを抜き取るのに使う。

### URI

URLをデータで持つときに昔よく使ってたけど、Mojoliciousに同じような機構が備わってるので最近使わなくなった。

おなじ理由で、URI::Escapeも最近はご無沙汰。

### URI::Find

テキストに含まれるURLをリンクに変換したりするときに使ってる。まあまあ使う。

## ファイル操作

### Path::Class

ファイルやディレクトリのパスを表現するときは必ず使ってる。$dir->file('test.txt')とか、こういう記法が美しい。

ディレクトリ内のファイルを走査するようなときも便利だったはず。

最近ではPath::Tinyというのが主流だそうで、そっちも気になってます。惰性で使っている。

### File::Copy

ファイルをコピーするときに使う、以上。

## データ構造

### JSON::XS

JSONデータを入出力するときの定番。

### Text::CSV_XS

CSVデータを入出力するときの定番。

### XML::LibXML

ウェブからダウンロードしてきたXMLを解析するときに使う。ただCPANを見てても使い方がよく分からない部分があってgetElementsByTagName(hoge)とかってメソッドを呼びまくる病にかかっている。XPathを使えればスマートに書けるはずなんだけど、Schemaみたいのが設定されてないXMLではXPathで探索できないのだろうか？

### XML::TreePP

もっと簡単にXMLを解析したいときに使う。XML::LibXMLと違ってPerlのハッシュとしてXMLを展開してくれるので、単純なXMLを扱うときには重宝する。

### List::Util

配列操作の便利関数がいくつか入ってる。maxとsumをたまに使う。

### List::MoreUtils

配列操作のもう少し便利で複雑な関数が入ってる。anyやuniqをたまに使う。

## 文字列操作

### HTML::Scrubber

HTMLから余計なタグを取り除く際に使う。WYSIWYGエディタを設置するときはセットで使います。

### String::Random

ランダムな文字列を作ってくれる。セッションIDや使い捨てパスワードを生成するときに使ってます。

### Digest::SHA

いわゆる文字列の暗号化（嘘です。ハッシュ化）みたいなことをやるときに使う。

### Digest::MD5

WebAPIを使ってるとMD5を求められることがあるのでしぶしぶ使う。

## 自分でモジュールを作るときに絶対使う

### Mouse

Perlでオブジェクト指向なコードを書きたいときは必ず使う。Mooseよりも軽いそうで、こっちを使っている。何が便利かを常時寝ぼけてる僕が説明するのは難しいので、書籍「モダンPerl入門」を購入してざっと読んだら分かりやすい。でも正直、今よくわかない人も、いずれ行き詰って自動的に触れることになるモジュールです。

書くのつかれた。。後日修正するかも。