sironekotoroの日記

Perl で楽をしたい

自作CLIアプリでもターミナルっぽいカーソル操作を行いたい!

自作CLIアプリでもターミナルっぽいカーソル操作を行いたい!

例えば、こんな感じの入力〜出力の簡単なスクリプトがあります。

#!/usr/bin/env perl
use strict;
use warnings;

while (1) {
    print "input>";
    my $input = <STDIN>;
    chomp $input;
    print $input . "\n";
}

入力して enter で確定すると、入力した文字列が出てくるようなのですね。Perl入学式の第2回でやるやつです。

で、ターミナルと同じようにカーソルキー(矢印キー)の上とかで過去の入力履歴を利用したいなー、と思って実際にカーソルキーを押すと・・・

f:id:sironekotoro:20200905100922p:plain

こんな感じになります。^[[A ってのはキーが押された時に実際に送信されるものです。

シェルである bashzsh はこれらを受け取って上に移動する、とか一つ前のコマンド履歴を出す、という動きに置き換えているわけです。

で、先の自作スクリプトでもターミナルと同じように過去のコマンド履歴を利用したいときはどうするか?ということで、今回は Term::ReadLine::Gnu を使ってみました。

metacpan.org

インストールはいつもの 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";
}

f:id:sironekotoro:20200905102406p:plain

これで矢印キーを使って過去の入力履歴を利用することができるようになりました。

入力したものはちゃんと chomp もしてくれるようで何よりですね。

入力と出力が連続するようなアプリ、例えばファイルの検索を連続して行うとか、株価コードを入れてその予想株価を返すのを繰り返すとか、そういう自作アプリに使っています。

2020年のPerl入学式

さて、新型コロナウイルスの蔓延により中止となった第5回から半年・・・運営メンバーで再始動に向けて動いています。

遠くないうちにお知らせできると思うので、Perl触ってみたい!けどきっかけがなかった・・・という方はお楽しみに!