Perl を学ぶとき、真っ先に覚えたいモジュール
春ですね! 新年度ですね! Perl 書くことになってしまいましたか! 奇遇ですね! sigil が意味わかりませんか! 特殊変数がググれませんか! リファレンスが謎ですか! 1; の存在が不明ですか! オブジェクト指向が難しいですか! むしろオブジェクトじゃないコードの方がゆるくて大変ですか! XS が読めませんか! ええ、XS は僕もあんまり読めません><
さて、この春から Perl を学ぶことになった人も多いかと思いますが、なにはなくともこれまず覚えたら後が楽になるんじゃないかというモジュールを、いくつか紹介したいと思います!
(まあ、自分の初期を思い返すと、この辺はやく知っておきたかったなあというリストです)
Data::Dumper, YAML
変数(リファレンス)やオブジェクト(blessされたリファレンス)をダンプする用途では、Data::Dumper が一番メジャーのような気もしますが、ものによっては YAML の Dump
の方が見やすかったりするかもしれません。
$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 の関数で、note
と explain
は便利なのでぜひ覚えておきましょう!
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のリストを引用してみます。
quoted from: Perlプログラマのレベル10 - Perlプログラミング救命病棟より
というわけで、ちょっとマニアックに思えるかもしれないけど最初から知ってると楽できるかも、なモジュールの紹介でした。
あと、
perldoc -q array
とかすると Perl FAQ が検索できる。これもけっこう便利。