2011年09月20日
リリースしました
にひりずむ::しんぷる - IO::Prompt::Simple 0.01 リリース
あらすじ
- xaicron:> ExtUtils::MakeMaker はロードに1秒ぐらいかかるから遅延ロードにしたた。prompt 使いたいだけなんだけど。IO::Prompt はなんかごついし、今後はコピペでいい気がしてきた。
- tokuhir○m:> @xaicron IO::Prompt::Simpleの予感
- xaicron:> @t○kuhirom srd!
というわけで適当にでっち上げた。
xaicron/p5-IO-Prompt-Simple - GitHub
基本的には ExUtils::MakeMaker の prompt() と同じだけど、第三引数で指定した文字じゃないとダメとか、この正規表現にマッチしたやつじゃないとだめとかを設定できる感じ。
あとは、terminal に接続されてないっぽい場合*1には入力はスキップされて、デフォルトのやつが使われるようにとかそんな感じ。*2
使い方
use IO::Prompt::Simple; say prompt 'そろそろ富士急ハイランド行きたいですね';
$ fujikyu.pl そろそろ富士急ハイランド行きたいですね: そうですね[Enter] そうですね
ってなります。簡単ですね。
デフォルトの指定
第二引数にデフォルト値も指定できます。何も入力せずに [Enter] を押したらデフォルト値が採用されます。
use IO::Prompt::Simple; say prompt 'くやしい...!! でも?', '感じちゃう';
$ crimson.pl くやしい...!! でも? [感じちゃう]: [Enter] 感じちゃう
EUMM と一緒ですね。
指定した文字だけ許可
anyone オプションを使用します。
use IO::Prompt::Simple; say prompt 'あなたの好きな釘宮を選んでください', undef, { anyone => [qw/ルイズ ナギ 大河/], };
あなたの好きな釘宮を選んでください (ルイズ/ナギ/大河) : 本人[Enter] # Please answer `ルイズ` or `ナギ` or `大河` あなたの好きな釘宮を選んでください (ルイズ/ナギ/大河) : ルイズ ルイズ
という感じ。
正規表現にマッチする奴
regexp オプションを使用します。anyone とは排他的で、anyone が優先されます。
use IO::Prompt::Simple; say prompt '4桁の数字を入れてください', undef, { regexp => '\d{4}', # or qr/\d{4}/, };
4桁の数字を入れてください : [Enter] # Please answer pattern (?-xism:\d{4}) 4桁の数字を入れてください : 1234 1234
とかとか。
大文字小文字を区別しない
ignore_case を true にします。anyone と regexp で大文字小文字を無視するようになります。
ただし、regexp を文字列ではなく Regexp オブジェクトにしている場合は無効。
use IO::Prompt::Simple; say prompt 'yes or no', undef, { anyone => [qw/yes no/], ignore_case => 1, };
$ yesno.pl yes or no (yes/no) : YeS[Enter] YeS
anyone が yes だからといって、小文字で返ってくるわけではないので注意。
エンコーディングを指定したい
入力された文字を encode で指定されたエンコーディングとみなして decode します。
anyone や regexp が指定されている場合、decode 後の文字でマッチングします。
use IO::Prompt::Simple; say prompt 'encoding test', undef, { encode => 'cp932' };
入力待ちをしない
CLI を書いていると、prompt をスキップしたいことがあります。yum の -y みたいな感じで。
以下のような場合に、入力待ちをしなくなります。
- $ENV{PERL_IOPS_USE_DEFAILT} が true *3
- use_default オプションが true
- ターミナルから切り離されている
ターミナルから切り離されている状態と言うのは、例えば STDIN と STDOUT が close されているような場合です。
cpanm とかでも似たような感じのことをしてますね。
input と output 先を変えたい
ファイルハンドルなら何でも指定できます。
例えば input に __DATA__ を指定する場合は以下のようになります。
use IO::Prompt::Simple; say prompt 'y or n', undef, { anyone => [qw/y n/], input => *DATA, }; __DATA__ y
$ using_data.pl y or n (y/n) : y y
上記のように、tty からではなければ、入力された値が出力されるので、log などに吐いている場合も後で見返せます。
まとめ
CLI をいっぱい書いてると、prompt 使いたいケースが結構あるので、外出ししてみました。
結果的に、EUMM+αで便利になったので良かったと思います。
まぁ、実際は IO::Prompt でそんなに困らないとは思いますが、ちょっとダミアン先生のコードは読みづらいし、微妙な機能とかがいっぱいあってうにゃーってなるので書いた次第。
-echo とかは便利だと思いますけど、/dev/tty とかハードコーディングされてたりして、Win32 でうごかないので mattn 先生に殺されるという話もあります。
もうちょい使ってみて問題なさげだったら CPAN に上げようかなと思います。
コメント一覧
この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう!

更新された場合に、より良く、より面白いかもしれ
更新された場合に、より良く、より面白いかもしれ



