Perl Hackers Hub

第26回Perlで困ったときの調べ方(1)

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはcharsbarこと石垣憲一さんで、テーマは困ったときの調べ方です。

検索エンジンを頼りづらいPerl

Perlを使い始めて間もない人を悩ませる問題の一つに、複雑なデータ構造のデリファレンスや、配列・ハッシュのスライス、コンテキストを特定するための演算子、特殊変数など、各種の記号や括弧を駆使したPerl特有の書き方がGoogleなどの検索エンジンでは事実上検索できない、というものがあります。また、モジュールを使えば楽ができると知ってはいても、結局どのモジュールを使えばよいかよくわからない、というのもよく聞く悩みです。

本稿では、このようなPerlを使っていて困ったときの調べ方をおさらいします。

Perl特有の書き方を調べる

書籍の目次や索引から調べる

Perlコミュニティは総じて後方互換性を大事にしてきました。10年前に書かれたコードが今でも手直しなしで動くのは割にあたり前のことになっていますし、モジュールのインストールに必要な基本的なツール群については、10年前のPerlでも動くように書くことが一つの指針となっています。だから、基本的な文法事項のように流行に左右されない事柄を調べるのであれば10年前の書籍でも十分役に立ちますし、たとえばお手元に2巻組の『プログラミングPerl』注1があるなら、その67ページにも及ぶ充実した索引をあたればかなりのことが調べられます。

ただし、そもそも記号や括弧の羅列からデリファレンスだスライスだとわかるようなら苦労はしません。検索エンジンで調べてもわからないようなことは、索引を見てもそれとわからない可能性が高いものです。欲しい情報が見つからなくてもあまりがっかりしないでください。調べ方も一つではないのですから。

付属のドキュメントを調べる

Perlは、インターネットの黎明期(れいめいき)から多くの人に使われてきたという事情もあって、インターネットに常時接続できない人でも困らないよう、基本的なドキュメントはすべてPerlのソースコードとともに配布されてきました。Perlをインストールすると、これらのドキュメントも所定の位置にインストールされ、各種のビューアで閲覧できます。

ドキュメントの一覧は、perlというドキュメントにまとまっています。Perl付属のperldocコマンドで閲覧する場合は、次のようにします。

$ perldoc perl

この一覧には100件以上のドキュメントが並んでいますが[2]⁠、もちろんそのすべてを読む必要はありません。おおまかな分類と、1行紹介がついていますので、必要そうなところのみ拾い読みすればよいでしょう。

文法や変数の使い方を調べる

Perlに慣れていない人がつまずきがちな内容は、主に次のドキュメントにまとまっています。

  • $、@、%、あるいは{、[の使い分けなどはperldataとperlref
  • 正規表現(/.../など)の詳細についてはperlre
  • サブルーチンの(特にやや高度な)使い方についてはperlsub
  • 日本語を始めとするマルチバイト文字の扱いについてはperlunicode

また、perlretut、perlreftutなど、tutで終わるものは初心者向けのチュートリアルになっています。基本的な使い方はこちらで確認してもよいでしょう。

関数の引数や戻り値、特殊変数の用法については、それぞれ次のコマンドを使うことでドキュメントの該当するセクションを簡単に取り出すことができます。

$ perldoc -f sprintf 関数名
$ perldoc -v $/ 変数名

ほかにも必要に応じて目を通しておきたいドキュメントはありますが、そもそもプログラミング自体に不慣れで一から順に勉強したい場合は、⁠初めてのPerl』注3など、国内外で定評のある入門書を先に読んでおくことをお勧めします。

Perlの最新事情を調べる

Perlがいかに後方互換性を大事にしているといっても、やはりリリースのたびに細かなバグは修正されていますし、新しい機能が追加されることも、場合によっては古い機能が廃止されることもあります。

インストールされているPerlの最新事情を確認したいときはperldeltaというドキュメントを参照してください。前のバージョンから何がどう変わったか、テーマごとに重要な変更点がまとめられています。

$ perldoc perldelta

また、過去の特定のバージョンの変更点を知りたい場合は、perldeltaの代わりにperl5100deltaなど、バージョン番号を含めたドキュメントを指定すると、そのバージョンと、その1つ前のバージョンの違いを一覧できます。

なお、これはあくまでインストールされているPerlの最新事情なので、Perl自体が古い場合はその後非推奨となった機能や書き方が紹介されていることもあります。本当に最新の情報を知りたい場合は、後述するようにPerl自体のバージョンを上げるか、CPANの検索サイトなどの情報を確認してください。

モジュールの書き方を調べる

外部に公開するかどうかはともかく、1つの案件の枠を超えて再利用可能なコードはモジュールの形にまとめ、古い案件のコードからコピー&ペーストを繰り返さないようにしたいものです。

Perlのドキュメントにはコードの書き方、モジュールの書き方についてまとめたものがいくつかあります。細かな点については流行り廃り(はやりすたり)が激しく、人によって意見が割れることも多いのですが、大原則については次のドキュメントが参考になります。

  • perlmodstyle
  • perlstyle

また、広く一般に公開するモジュールについては移植性の問題も考慮しておいたほうがよいでしょう。特にWindows環境ではパスの区切り文字やファイルのパーミッションがよく問題になります。詳しくはperlportというドキュメントをご覧ください。

Perlの拡張法を調べる

Perlのモジュールの中には、全体の1割ほどですが、Cで書かれた外部ライブラリを利用したり、PerlのC APIを使って処理を高速化しているものがあります。このようなモジュールを一から書く必要に迫られることはそう多くはありませんが、データベース処理や、HTML/XMLのパーサ、各種シリアライザ、暗号化や文字コードの処理など、この手のモジュールには業務上不可欠なものが多いので、概要くらいは調べる必要が出てくるかもしれません。

Cの外部ライブラリを利用するモジュールを読み書きする際は、次のドキュメントが役に立ちます。

  • perlxs
  • perlxstypemap

PerlのC APIの使い方については次の3つが参考になります。また、余裕があればPerlのソースコード(特にsv.c)を読んでみるのも有益です。

  • perlguts
  • perlcall
  • perlapi

ドキュメントを検索する

さて、ここまでいくつかのドキュメントの名前を挙げてきましたが、ドキュメントが手元にインストールされている最大の利点は、grepなどのコマンドを使って自由に検索できることです。

Perlのドキュメントがインストールされている場所は環境によって異なります。簡単に調べるには、perldocコマンドの-lオプションを利用します。

$ perldoc -l perl
/usr/share/perl/5.10/pod/perl.pod

-lオプションを使うと、指定したドキュメントのフルパスが表示されます。Perl本体に付随する主要なドキュメントはすべて同じディレクトリにインストールされるので、この例の場合であれば/usr/share/perl/5.10/podディレクトリ配下のすべてのファイルを検索すればよいことがわかります。

ドキュメントの保存先がわかったところで、実際に一般的な検索エンジンでは検索できない慣用句を検索してみましょう。ここでは最も単純なgrepコマンドを使って、+{ ... }という慣用句[4]を探してみます。

$ grep -r '+{' /usr/share/perl/5.10/pod/

このようにツールを使ってドキュメントの検索をするときは、必要に応じてシェルや正規表現の特殊記号をエスケープしなければなりません。今度はegrepコマンドを使って配列のスライス@foo[0..3]のような書き方)が登場するドキュメントを検索する例を見てみましょう。この場合、変数名は何でもよいので正規表現で読み飛ばすのが簡単ですが、[をエスケープしておかないと正規表現のエラーになります。

$ egrep -r '@\S+[' /usr/share/perl/5.10/pod/ エラー
$ egrep -r '@\S+\[' /usr/share/perl/5.10/pod/ OK

ドキュメントの翻訳を読む

Perlに付属しているドキュメントはほぼすべて英語で書かれていますが、主要なものについては有志による翻訳があります。バージョンの違いにより翻訳と手元の原文が異なる場合もあるので注意が必要ですが、概要をつかむうえでは参考になるはずです。

整形済みの翻訳はperldoc.jpというサイトで公開されています。

いちいちブラウザで閲覧するのが面倒な方は、拙作のPod::PerldocJpモジュールに付属するperldocjpコマンドを利用すると、perldoc.jpから翻訳をダウンロードしてきて画面用に整形・表示できます(翻訳がない場合はperldocコマンドと同じく原文を表示します⁠⁠。

$ cpanm Pod::PerldocJp
$ perldocjp perl

任意のPerlをインストールする

Perlはどんなに安価なレンタルサーバでも標準で入っていることが期待できたため、前世紀末にはWebサイトを動的に更新する有力な手法の一つとして、FTPFile Transfer ProtocolでアップロードしたスクリプトをWebサーバのCGI Common Gateway Interfaceを通じてOS付属のPerl(システムPerl)に実行させる手法が爆発的に普及しました。このような用途であれば、システムPerlでも十分に事が足ります。

一方で、本格的にアプリケーションを開発・運用するようになると、最新版より数世代も古かったり、OSの種類やインストールする時期によってバージョンが異なったりするシステムPerlの制約が問題になる場面も出てきます。

そのため最近の開発現場では、開発機に入っているシステムPerlではなく、案件ごとにカスタマイズした仮想マシン上のPerlを使ったり、開発機に複数のPerlを入れて、必要に応じて切り替えるのがベタープラクティスの一つとなりつつあります。

もちろん調べものをする際にも任意のバージョンのPerlをインストールできるようにしておくことは大いに役に立ちます。まだ用意ができていない人は、この機会にぜひ環境を整備しておきましょう。

plenvをインストールする

UNIX系の環境で複数バージョンのPerlを切り替えて使うなら、plenvというツールを利用するのがお勧めです[5]⁠。同じようなツールにperlbrewがありますが、plenvはディレクトリごとに利用するPerlのバージョンを変えられるため、ユーザを追加したり仮想マシンを追加したりせずとも簡単に複数バージョンのPerlを使い分けられるのが特徴です。

plenvのインストールは次の手順で行います。

①GitHubから必要なリポジトリを所定の位置にクローンする
$ git clone \
  git://github.com/tokuhirom/plenv \
  ~/.plenv
$ git clone \
  git://github.com/tokuhirom/Perl-Build \
  ~/.plenv/plugins/perl-build/
②ログイン時にパスを通し、初期化を行うようにしたうえで、設定を反映させる[6]
$ echo 'export PATH="$HOME/.plenv/bin:$PATH"' \
  >> ~/.bash_profile
$ echo 'eval "$(plenv init -)"' \
  >> ~/.bash_profile
$ exec $SHELL -l

なお、plenvコマンドはperlbrewコマンドとは共存できません。過去にperlbrewコマンドを利用していた場合は、.bash_profileファイルからperlbrewコマンド関連の設定を削除する必要があります。

必要なPerlをインストールする

plenvコマンドのインストールが済んだら、必要なバージョンのPerlをインストールします。基本的にはインストールしたいバージョンを指定するだけですが、必要に応じてさまざまな設定を追加できます。設定の詳細については、Perlのソースディストリビューションに同梱されているINSTALLファイルやConfigureファイルをご覧ください。

$ plenv install 5.18.2
$ plenv install 5.19.9 -DEBUGGING=-g
  デバッグ情報を有効にする場合

なお、Perlはバージョン5.6以降、マイナーバージョンが偶数のものが安定版、奇数のものが開発版となっています。執筆時の2014年3月時点の安定版は5.18.2、開発版は5.19.10です。また、2014年5月には次の安定版となる5.20がリリースされる予定です。

インストールしたPerlを使う

plenvコマンドでインストールしたPerlは、そのままでは使えません。システムPerlの代わりに使うのであれば、globalサブコマンドにインストール済みのPerlのバージョンや別名を渡します。

$ plenv global 5.18.2

特定のディレクトリでだけPerlのバージョンを変えたい場合は次のようにします。

$ plenv local 5.18.2

plenvコマンドのそのほかの使い方については、plenvコマンドをクローンしたディレクトリ直下にあるREADMEファイルをご覧ください。

<続きの(2)こちら。>

おすすめ記事

記事・ニュース一覧