Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

PerlでどこでもREPLする

ir_b で快適 irb 生活!が面白い感じだったのでPerlでもできないのかなーってんでCPANを見てみたら、Carp::REPLで同じようなことができそうな感じでした。

#!/usr/bin/env perl
use strict;
use warnings;
use Carp::REPL qw(repl);

my $foo = 'foo value';
repl();        #=> ここでREPLに入る
               #=> ↓は、REPLをC-dが:qコマンドで抜けた後に実行される

my $baz = 'baz value';
print "$baz\n";

上記を実行してみると、以下のような感じ。いろいろコマンドがあるので、そのあたりはCarp::REPLのドキュメントを参照のこと。

$ perl unko.pl

Trace begun at unko.pl line 7

$ $foo
foo value                                                                  

$ :e
$Env = { "\$foo" => \do { my $v = 'foo value' } };

$ :l
File unko.pl:
  2: use strict;
  3: use warnings;
  4: use Carp::REPL qw(repl);
  5: 
  6: my $foo = 'foo value';
* 7: repl();                 #=> ここでREPLに入る
  8:                         #=> ↓は、REPLをC-dで抜けた後に実行される
  9: 
 10: my $baz = 'baz value';
 11: print "$baz\n";                                                       

$ :q
baz value

他のユースケースとして、テストの際に便利な機能もあったりします。以下のテストスクリプトのような、通らないテストがあったとして、

use strict;
use warnings;
use Test::More;
use Carp::REPL qw(test);

my $foo = 'foo';

ok $foo;
is $foo, 'bar'; #=> 通らない

done_testing;

その通らなかったところでREPLが立ち上がります。そこで、変数の中身を見たりして、どうなってるのか確認できるので便利です。

$ prove -v unko.t
unko.t ..
ok 1
not ok 2

#   Failed test at unko.t line 9.
Test failure
Trace begun at unko.t line 9

$ :l
File unko.t:
  4: use Carp::REPL qw(test);
  5:
  6: my $foo = 'foo';
  7:
  8: ok $foo;
* 9: is $foo, 'bar'; #=> 通らない
 10:
 11: done_testing;

$ $foo
foo