にひりずむ::しんぷる - IO::Prompt::Simple 書いた
会社の印刷のために IO::Promptを使ったスクリプトがあったんですが、
IO::Promptが Perl 5.14で動かない問題があったので,
自分で適当に書いたコードを使っていました。
そんな中 @xaicronさんが IO::Prompt::Simpleというモジュールを書いた
というのを知ったのでそれに置き換えようと思ったんだけど、コードを
いじらずにというのが無理だったので、機能拡張ということでモジュールの
方に手を入れてみました。追加したのは選択肢のいずれかを選んだ時にそれに
対応する値を返すというものです。
パッチ
利用例
#!perl use strict; use warnings; use utf8; use Encode qw(encode_utf8); use IO::Prompt::Simple; binmode STDOUT, ":utf8"; my $output = prompt "Where do you live ?", undef, { anyone => { tokyo => '03', osaka => '06', kyoto => '075', }, }; print "市外局番は $output です.\n";
使ってみると以下のような感じです.
% perl prompt.pl Where do you live ? (tokyo/osaka/kyoto) : nagoya # Please answer `tokyo` or `osaka` or `kyoto` Where do you live ? (tokyo/osaka/kyoto) : osaka 市外局番は 06 です.
IO::Promptでは以下のように使っていたので手を入れたと
いうのが実のところです.
#!perl use strict; use warnings; use IO::Prompt::Simple; my $option = { anyone => { yes => 1, no => 0, }, }; unless (prompt "Input >> ", undef, $option) { die "Exit"; } hogehoge();
オリジナルのものでも戻り値が 'no'であるとき、っていう具合に
条件分岐を書けばいいんだけど、ちょっと見た目が、と思って
手を加えてみた次第です。
Simpleとついているので、あんまり複雑にすべきでないだろうし、
ライブラリを使う側で対応が容易に行えるので、そっちで対応する
ことにします。
おわりに
IO::Prompt::Simpleに少し手を入れてみたことを書きました。
しかし人のコードに手を入れるときっていろいろ考えてしまいますね。
追加だけで済むならそんなになんですけど、既存のコードと重なりあう
ときってオリジナルのエッセンスを残すべきなのかとかいろいろ
考えてしまいます。上記のパッチはオリジナルのコードをわりと残そうと
思って書いたものなのですが、全体で見ると汚いという印象ですね。
そのあたりはまだまだ修行不足なんで、精進しないといけませんね。