tokuhirom's Blog

Perl5 で irb 相当のことをする方法、すなわち REPL をする方法

Perl5 で REPL(Read-Eval-Print-Loop)をつかいたければ、perl -de 1 をつかえばいい。

perl5 についているデバッガ機能をつかえば、一応 REPL っぽいことはできるので、以下のようにしてつかう。

% perl -de 1

Loading DB routines from perl5db.pl version 1.33
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1):   1
  DB<1> print 3+2;
5
  DB<2> 

ただしこの場合、lexical 変数が保存されないのでたとえば以下のコードは意図したとおりにはうごかない。

  DB<1> my $x =1;

  DB<2> print $x, "\n";

この問題を解決するために mst が開発したのが Eval::WithLexicalsで、このモジュールに添付されている tinyrepl コマンドをつかうと以下のように意図した動作となる。Eval::WithLexicals は依存もすくないので、気軽に導入できる。

% tinyrepl
re.pl$ my $x = 1;
1
re.pl$ print $x, "\n";
1
1

また mst が以前につくった Devel::REPL というモジュールがあって、これは非常に高機能なのだが、起動に時間がかかるし依存が非常におおいのでおすすめしない。