NAME

IO::Prompt::Simple - provide a simple user input

SYNOPSIS

# foo.pl
use IO::Prompt::Simple;

my $answer = prompt 'some question...';
print "answer: $answer\n";

# display prompt message, and wait your input.
$ foo.pl
some question: foo[Enter]
answer: foo

DESCRIPTION

IO::Prompt::Simple is porting ExtUtils::MakeMaker's prompt() function.

Added a few more useful features.

THIS MODULE IS ALPHA LEVEL INTERFACE!!

FUNCTIONS

prompt($message, [$default_or_option])

Display prompt message and wait your input.

$answer = prompt $message;

Sets default value:

$answer = prompt 'sets default', 'default';
is $answer, 'default';

or

$answer = prompt 'sets default', { default => 'default' };
is $answer, 'default';

Display like are:

sets default [default]: [Enter]
...

supported options are:

default: SCALAR

Sets default value.

$answer = prompt 'sets default', { default => 'default' };
is $answer, 'default';
anyone: ARRAYREF | HASHREF | REF-ARRAYREF | Hash::MultiValue

Choose any one.

$answer = prompt 'choose', { anyone => [qw/y n/] };

Display like are:

choose (y/n) : [Enter]
# Please answer `y` or `n`
choose (y/n) : y[Enter]
...

If you specify HASHREF, returned value is HASHREF's value.

$answer = prompt 'choose', { anyone => { y => 1, n => 0 } };
is $answer, 1; # when you input is 'y'

And, when you specify the verbose option, you can tell the user more information.

$answer = prompt 'choose your homepage', {
    anyone => {
        google => 'http://google.com/',
        yahoo  => 'http://yahoo.com/',
        bing   => 'http://bing.com/',
    },
    verbose => 1,
};

Display like are:

# bing   => http://bing.com/
# google => http://google.com/
# yahoo  => http://yahoo.com/
choose your homepage : [Enter]
# Please answer `bing` or `google` or `yahoo`
choose your homepage : google[Enter]
...

If you want preserve the order of keys, you can use Hash::MultiValue.

$answer = prompt 'foo', { anyone => { b => 1, c => 2, a => 4 } }; # prompring => `foo (a/b/c) : `
$answer = prompt 'foo', {
    anyone => Hash::MultiValue->new(b => 1, c => 2, a => 4)
}; # prompring => `foo (b/c/a) : `

Or, you can use REF-ARRAYREF.

$answer = prompt 'foo', { anyone => \[b => 1, c => 2, a => 4] };
choices

Alias of anyone

multi: BOOL

Returned multiple answers. Your answer are evaluated separated by space.

use Data::Dumper;
@answers = prompt 'choices', {
    choices => [qw/a b c/],
    multi   => 1,
};
print Dumper \@answers;

Display like are:

choices (a/b/c) : c a[Enter]
$VAR1 = [
          'c',
          'a'
        ];

Or, you can specify HASHREF:

use Data::Dumper;
@answers = prompt 'choices', {
    choices => {
        google => 'http://google.com/',
        yahoo  => 'http://yahoo.com/',
        bing   => 'http://bing.com/',
    },
    verbose => 1,
    multi   => 1,
};
print Dumper \@answers;

Display like are:

# bing   => http://bing.com/
# google => http://google.com/
# yahoo  => http://yahoo.com/
choices: google yahoo[Enter]
$VAR1 = [
          'http://google.com/',
          'http://yahoo.com/'
        ];
regexp: STR | REGEXP

Sets regexp for answer.

$answer = prompt 'regexp', { regexp => '[0-9]{4}' };

Display like are:

regexp : foo[Enter]
# Please answer pattern (?^:[0-9{4}])
regexp : 1234
...

It regexp and anyone is exclusive (anyone is priority).

ignore_case: BOOL

Ignore case for anyone or regexp.

# passed `Y` or `N`
$answer = prompt 'ignore_case', {
    anyone      => [qw/y n/],
    ignore_case => 1,
};
yn: BOOL

Shortcut of { anyone => \[ y => 1, n => 0 ], ignore_case => 1 }.

$answer = prompt 'are you ok?', { yn => 1 };

Display like are:

are you ok? (y/n) : y[Enter]
use_default: BOOL

Force using for default value. If not specified defaults to an empty string.

$answer = prompt 'use default', {
    default     => 'foo',
    use_default => 1,
};
is $answer, 'foo';

I think, CLI's --force like option friendly.

input: FILEHANDLE

Sets input file handle (default: STDIN)

$answer = prompt 'input from DATA', { input => *DATA };
is $answer, 'foobar';
__DATA__
foobar
output: FILEHANDLE

Sets output file handle (default: STDOUT)

$answer = prompt 'output for file', { output => $fh };
encode: STR | Encoder

Sets encoding. If specified, returned a decoded string.

color: STR | ARRAYREF

Sets prompt color. Using Term::ANSIColor.

$answer = prompt 'colored prompting', { color => [qw/red on_white/] };

NOTE

If prompt() detects that it is not running interactively and there is nothing on $input or if the $ENV{PERL_IOPS_USE_DEFAULT} is set to true or use_default option is set to true, the $default will be used without prompting.

This prevents automated processes from blocking on user input.

AUTHOR

xaicron <xaicron {at} gmail.com>

COPYRIGHT

Copyright (C) 2011 Yuji Shimada (@xaicron).

LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

ExtUtils::MakeMaker IO::Prompt