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