IO::Prompt::Simpleを少しいじってみた

にひりずむ::しんぷる - IO::Prompt::Simple 書いた


会社の印刷のために IO::Promptを使ったスクリプトがあったんですが、
IO::Promptが Perl 5.14で動かない問題があったので,
自分で適当に書いたコードを使っていました。


そんな中 @さんが 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に少し手を入れてみたことを書きました。


しかし人のコードに手を入れるときっていろいろ考えてしまいますね。
追加だけで済むならそんなになんですけど、既存のコードと重なりあう
ときってオリジナルのエッセンスを残すべきなのかとかいろいろ
考えてしまいます。上記のパッチはオリジナルのコードをわりと残そうと
思って書いたものなのですが、全体で見ると汚いという印象ですね。
そのあたりはまだまだ修行不足なんで、精進しないといけませんね。

追記

にひりずむ::しんぷる - IO::Prompt::Simple 0.01 リリース


リリースされたものには HashRefを指定して上記のような
使い方が可能になっています。