1

我在使用正则表达式验证用户输入时遇到困难。我正在尝试获取用户输入并确保它在 1 到 99 之间。如果不是,那么它会调用相同的子例程,直到匹配验证条目。但是,即使输入在 1-99 之间,它也会继续调用子例程。

sub get_age
{
    print "Age :";
    @get_age = <STDIN>;
    if (scalar @get_age  !~ m/\d[1-99]/ ) #making sure age given is between 1 and 99
    {

            print "ERROR, invalid input\n";
            &get_age; #this is callng the same sub it's in to re-run validating
    }

            push(@get_age, <STDIN>); #taking name from user and putting it in @get_name     array
            chomp(@get_age); #erasing newline from input
}
4

4 回答 4

4
于 2013-04-07T21:04:54.737 回答
2
#!/usr/bin/env perl

use 5.012;
use strict; use warnings;
use Term::Prompt qw( prompt );

my $age = prompt(s => 'Age:', 'between 1 and 99', '', sub {
        my ($input) = @_;
        ($input) = ($input =~ /\A\s*( [1-9] [0-9]? )\s*\z/x);
        return $input and ($input >= 1) and ($input <= 99);
    }
);

say $age;
于 2013-04-07T22:52:34.177 回答
1

[1-99]是从 1 到 9 的所有字符和字符 9 的集合。

试试[1-9]|([1-9]\d)吧。这意味着 1-9 或任何两个不以零开头的数字。

于 2013-04-07T20:49:37.417 回答
1

我认为这是您的代码的改进版本:

use strict;
use warnings;

sub get_age_and_name
{
    my $age;
    while(1) {
        print "Age : ";
        $age = <STDIN>;
        chomp $age;
        # Making sure age given is between 1 and 99
        last if( $age =~ m/^\d\d?$/ and ($age>=1) and($age<=99) );
        print "Error ERROR, invalid input\n";
    } 

    print "Name : ";
    my $name = <STDIN>;
    chomp $name;
    return ($age, $name);
}


my ($age, $name) = get_age_and_name;
print "($age, $name)\n";
于 2013-04-07T21:01:49.450 回答