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