2013/04/15

Perl を学ぶとき、真っ先に覚えたいモジュール

春ですね! 新年度ですね! Perl 書くことになってしまいましたか! 奇遇ですね! sigil が意味わかりませんか! 特殊変数がググれませんか! リファレンスが謎ですか! 1; の存在が不明ですか! オブジェクト指向が難しいですか! むしろオブジェクトじゃないコードの方がゆるくて大変ですか! XS が読めませんか! ええ、XS は僕もあんまり読めません><

さて、この春から Perl を学ぶことになった人も多いかと思いますが、なにはなくともこれまず覚えたら後が楽になるんじゃないかというモジュールを、いくつか紹介したいと思います!
(まあ、自分の初期を思い返すと、この辺はやく知っておきたかったなあというリストです)

Data::Dumper, YAML

変数(リファレンス)やオブジェクト(blessされたリファレンス)をダンプする用途では、Data::Dumper が一番メジャーのような気もしますが、ものによっては YAMLDump の方が見やすかったりするかもしれません。

$c とか $stash とか $rhData はこれで覗くといいお!!

Data::Dumper の場合

$ perl -MData::Dumper -MLWP::UserAgent -e 'print Dumper(LWP::UserAgent->new);'
$VAR1 = bless( {
                 'max_redirect' => 7,
                 'protocols_forbidden' => undef,
                 'show_progress' => undef,
                 'handlers' => {
                                 'response_header' => bless( [
...snip...

YAML の場合

$ perl -MYAML -MLWP::UserAgent -e 'print Dump(LWP::UserAgent->new);'
--- !!perl/hash:LWP::UserAgent
def_headers: !!perl/hash:HTTP::Headers
  user-agent: libwww-perl/5.836
handlers:
  response_header: !!perl/array:HTTP::Config
    - callback: !!perl/code '{ "DUMMY" }'
...snip...

Test::More

Perl を書いていくに当たって、どのモジュールよりも一番付き合うことになるのが Test::More です(たぶん)。Perl でテストを書くには欠かせません。

で、初学者だとお試しコードを書いて print して結果を見るといういわゆる print デバッグ をよくやるかと思うんですが、自分は最初から Test::More 使っとけ派です。自分で print するよりちょっと多い情報が見えるし、テストを自然に書けるようになるからです。特に perl の関数群を使ってみるコードを書くときには是非 Test::More オススメです。

[substr.t]

use strict;
use warnings;
use Test::More;

my $c = "abcdef";

is( substr($c, 1, 2), "ab" );

done_testing;

とかいう風に substr 関数を試してみると、

$ perl substr.t
not ok 1
#   Failed test at foo.pl line 7.
#          got: 'bc'
#     expected: 'ab'
1..1
# Looks like you failed 1 test of 1.

'ab' を期待してるけど、'bc' だったよ! みたいにわかるわけです。(substr は先頭が 0 ですね!)

note explain $ref;

Test::More の関数で、noteexplain は便利なのでぜひ覚えておきましょう!

note はテスト結果にメッセージを出力するための関数で、explain はダンプするための関数。以下のように組み合わせて使うと、Data::Dumper などを使う必要がない。

is_deeply($have, $want) || note explain $have;

Test::More の関数群はドキュメント見るかググれば山ほど見つかるYO!

Devel::Peek

Devel::Peek は変数が Perl 内でどのように扱われているかを見ることが可能です。use Devel::Peek; すると Dump という関数が使えるようになるので、以下のように変数の情報を出します。

$ perl -MDevel::Peek -e 'my $c="foo"; $ref=\$c; Dump($ref);'
SV = RV(0x8a3e8dc) at 0x8a176a8
  REFCNT = 1
  FLAGS = (ROK)
  RV = 0x8a16cdc
  SV = PV(0x8a17b00) at 0x8a16cdc
    REFCNT = 2
    FLAGS = (PADBUSY,PADMY,POK,pPOK)
    PV = 0x8a2cc58 "foo"\0
    CUR = 3
    LEN = 4

まったくの初学者でいきなりこんなの見せられても意味がわからない>< ってなるかもしれませんが、変数に関する意味不明の挙動(ハッシュスライス、each、文字化けあたり)を誰かに相談するときに、コードとあわせてこの情報をもって行けば、少し話が早い気がします!

B::Deparse

B::Deparse は Perl がソースコードをコンパイルした後のコードを見ることが出来ます。例えば、ちょっと乱暴な例ですが、以下のような良くわからないけど実行できるコードがあるとして、

$ perl -e 'use strict; use warnings; 0->[0] = 100; print 0->[0];'
100

どうなってんのこれ? というときに、B::Deparse してみる。

$ perl -MO=Deparse -e 'use strict; use warnings; 0->[0] = 100; print 0->[0];'
use warnings;
use strict 'refs';
$0[0] = 100;
print $0[0];
-e syntax OK

なるほど、0 は特殊変数だったのか、とかわかる。

モジュール名は B::Deparse なのに使うときは -MO=Deparse というのが覚えにくいですが、なんだか実行できてしまうぜ、とかいうのを見るのに使えます。

$ perl -MO=Deparse -e 'my $d=60*60*24; print $d;'
my $d = 86400;
print $d;
-e syntax OK

上記のように、定数畳み込みが行われてるのとかも見れます。

デバッガ

なにはなくともデバッガです。perl をステップ実行しながらいろいろ確認したりできます。

使い方は簡単。起動オプションに -d つけるだけですね。

perl -d foo.pl

使い方とかは perldebug にドキュメントがあります。

$ perldoc perldebug

翻訳もこちらにありました。

まとめ

さいごに、Perl を学ぶときに道しるべとなる情報を紹介します。引用の引用になりますし、ちょっと古い本のものなので、モダン Perl においては議論の余地があるかもしれませんが、まだこの階段自体は有効に使えるのではないかと思います。

Perlプログラミング救命病棟という書籍から、ちょっと長いですがそんなPerlプログラマのレベル10のリストを引用してみます。

というわけで、ちょっとマニアックに思えるかもしれないけど最初から知ってると楽できるかも、なモジュールの紹介でした。

あと、

perldoc -q array

とかすると Perl FAQ が検索できる。これもけっこう便利。

サイト内検索