自作CLIアプリでもターミナルっぽいカーソル操作を行いたい!
例えば、こんな感じの入力〜出力の簡単なスクリプトがあります。
#!/usr/bin/env perl use strict; use warnings; while (1) { print "input>"; my $input = <STDIN>; chomp $input; print $input . "\n"; }
入力して enter で確定すると、入力した文字列が出てくるようなのですね。Perl入学式の第2回でやるやつです。
で、ターミナルと同じようにカーソルキー(矢印キー)の上とかで過去の入力履歴を利用したいなー、と思って実際にカーソルキーを押すと・・・
こんな感じになります。^[[A
ってのはキーが押された時に実際に送信されるものです。
シェルである bash
や zsh
はこれらを受け取って上に移動する、とか一つ前のコマンド履歴を出す、という動きに置き換えているわけです。
で、先の自作スクリプトでもターミナルと同じように過去のコマンド履歴を利用したいときはどうするか?ということで、今回は Term::ReadLine::Gnu
を使ってみました。
インストールはいつもの cpanm
$ cpanm Term::ReadLine::Gnu
こんな感じです。ほぼ、モジュールページの SYNOPSYS のまんまです。助かりますねー
#!/usr/bin/env perl use strict; use warnings; use Term::ReadLine; # Do not "use Term::ReadLine::Gnu;" my $term = new Term::ReadLine 'ProgramName'; while ( defined( my $input = $term->readline('prompt>') ) ) { print $input . "\n"; }
これで矢印キーを使って過去の入力履歴を利用することができるようになりました。
入力したものはちゃんと chomp
もしてくれるようで何よりですね。
入力と出力が連続するようなアプリ、例えばファイルの検索を連続して行うとか、株価コードを入れてその予想株価を返すのを繰り返すとか、そういう自作アプリに使っています。
2020年のPerl入学式
さて、新型コロナウイルスの蔓延により中止となった第5回から半年・・・運営メンバーで再始動に向けて動いています。
遠くないうちにお知らせできると思うので、Perl触ってみたい!けどきっかけがなかった・・・という方はお楽しみに!
昨今の新型コロナ情勢によって春から活動できていなかった #Perl入学式 ですが、10月開催に向けて水面下で準備中です。
— Perl入学式 (@Perl_Entrance) 2020年8月31日
9月初旬までには色々発表できるかも!?ご期待下さい!