Perl перепроверяет пользовательский ввод, пока не получит точный ожидаемый ввод - PullRequest
0 голосов
/ 17 октября 2011

Как сделать сценарий очень интерактивным?

Цель сценария:
Получить введенный пользователем номер и найти мод с помощью функции get_mod_val;если он возвращает 1, скажите «хорошо» и выйдите из скрипта;если он возвращает 0, попросите пользователя ввести нечетное число.

Проверка:

  1. допускаются только цифры, без символов, десятичные, специальные символы.
  2. незавершайте сценарий, пока пользователь не введет нечетное число.

Следующий код работает нормально;это следует выше правилам пункта 1 проверки, но это не очень интерактивно согласно нашему требованию закона.Когда вышеприведенные правила не выполняются, сценарий завершается, и нам нужно снова выполнить сценарий.

Как сделать следующий код очень интерактивным?

$ip_no = $ARGV[0];
if ($ip_no!="") {

    $get_mod_op = get_mod_val($ip_no);
    if ($ip_no =~ /\D/){
        print "Entered number only.....";
        exit;
    }else{
        if ($get_mod_op==1) {
            print "Good odd number(${get_mod_op}): ${ip_no} ";
            exit;
        }else{
            print "Good even number(${get_mod_op}): ${ip_no} ";
            exit;
        }

    }
}else{
    print "Enter number.";
    exit;
}

Спасибо всем, наконец-то я выполнилКод с вашими предложениями, следуя сниппету, достиг моего требования, просмотрите код и посоветуйте для оптимизации.

if ($ARGV[0] != "") {
    $user_ip = $ARGV[0];
}elsif (($ARGV[0] =~ /\D/ ) || ($ARGV[0] eq "") ){
     print "Enter odd number only: ";
     $user_ip = <STDIN>;
}else{
    $user_ip = <STDIN>;
}

do{ #get mod value, if mod_off is 1 then entered number is odd otherwise ask user to enter the odd number
    $mod_off = find_mod_val($user_ip);
    if (($user_ip == "") || ($user_ip eq "") || ($user_ip eq "") || ($mod_off == 0)) {
        print "Enter odd number only: ";
        $user_ip = <STDIN>;
    }
}until($mod_off == 1);

print "Good odd number ${user_ip}";



sub find_mod_val($user_ip){
    return $user_ip%2;
}
__END__

Ответы [ 4 ]

2 голосов
/ 17 октября 2011

TIMTOWTDI, на этот раз с рекурсией!Преимущество состоит в том, что вы можете повторно использовать функцию для проверки других входных данных.Я думаю, вы могли бы сделать саб, который оборачивает петлю, но давай это весело!

sub get_input {
  my ($message, $valid) = @_;
  print "$message: ";
  chomp(my $response = <>);
  unless( $response =~ $valid ) {
    print "Invalid response!\n";
    $response = get_input($message, $valid);
  }
  return $response;
}

my $response = get_input("Enter a number", qr/^\d+$/);
print "Got: $response\n";
2 голосов
/ 17 октября 2011

Не используйте ARGV [0] и читайте из STDIN (поэтому вам нужно запустить скрипт и набрать нужное слово). Я переписал твой код:

my $finish = 0;
while( ! $finish ) {
    print "Enter number.";
    my $ip_no = <STDIN>;
    chomp($ip_no);
    $get_mod_op = get_mod_val($ip_no);
    if( $ip_no =~ /\D/ ){
        print "Entered number only.....";
    }
    elsif( $get_mod_op == 1 ) {
        print "Good odd number(${get_mod_op}): ${ip_no} ";
        $finish = 1;
    } 
    else {
        print "Good even number(${get_mod_op}): ${ip_no} ";
        $finish = 1;
    }
}
1 голос
/ 17 октября 2011
my $val;
for (;;) {
   print "Some prompt: ";
   $val = <STDIN>;
   chomp $val;
   last if is_valid($val);
   print "Bad input. Valid inputs are ...\n";
}
1 голос
/ 17 октября 2011
  1. Вы уверены, что хотите, чтобы он был интерактивным; это делает его гораздо менее полезным в других скриптах.
  2. Если необходимо, поместите код тестирования в подпрограмму, затем используйте подпрограмму для проверки $ARGV[0], а в случае неудачи перейдите в цикл, который запрашивает ввод и запускает проверку.
  3. Проверьте модуль Perl IO :: Prompt .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...