我正在尝试编写Perl脚本来验证用户输入。 如果用户提供了错误的值,那么它应该显示所提供的用户输入中的错误值。
示例:
我有任何数组@arr=qw/cat rat mat sat/;
如果用户提供的输入为perl validate_user_input.pl cat sot bat
,那么我的脚本应显示sot bat
是脚本的错误输入。
下面是我尝试的脚本。
#!/usr/bin/perl
use strict;
use warnings;
my (@not,@arr,$flag);
@arr=qw/cat rat mat sat/;
my $count=@arr;
foreach (@ARGV)
{
my $i=1;
foreach my $existing (@arr)
{
until ( "$existing" eq "$_" )
{
$flag = 1;
$i++;
last;
}
}
print "$i\n";
if ( ($count==$i) && ($flag == 1))
{
push(@not,"$_");
}
}
print "@not\n";
逻辑我试图实现:
@ARGV
中的元素将针对@arr
的每个元素进行检查。如果$flag=1
且迭代$i
等于@arr
中的元素数量(即根据@arr
中的所有元素进行检查),则输入未在@arr
中找到
任何人都可以告诉我该脚本需要做什么才能发挥作用。
答案 0 :(得分:1)
太复杂了。将“有效”参数转换为哈希值,然后使用grep
:
#!/usr/bin/env perl
use strict;
use warnings;
my @allowed = qw/cat rat mat sat/;
my %is_allowed = map { $_ => 1 } @allowed;
foreach my $arg ( grep { not $is_allowed{$_} } @ARGV ) {
print "$arg is not valid\n";
}
如果您愿意,可以在该foreach循环中设置一个标志。或者只是在标量上下文中使用grep
:
if ((grep { not $is_allowed{$_} } @ARGV) > 0 ) {
die "invalid args found, exiting\n"
}
答案 1 :(得分:0)
好吧,对这个网站的简短搜索会让我相信你的事情过于复杂:
#!/usr/bin/env perl
use strict;
use warnings;
my (@not,@arr);
@arr=qw/cat rat mat sat/;
foreach (@ARGV)
{
push(@not,"$_") unless ( "$_" ~~ @arr );
}
print "@not\n";
智能匹配运算符(~~)仍然会回来作为实验'在我的5.24版本的bash上,但它似乎已经存在至少5.10。
您可能还想在最后添加某种测试,以检查@not中是否包含任何内容,因为可能找到了所有单词。你可以重复使用你的旗帜:)
答案 2 :(得分:0)
将有效参数放入哈希%valid
(而不是数组@arr
)。然后你可以这样做:
for (@ARGV) {
push @not, $_ if !exists $valid{$_};
}
答案 3 :(得分:0)
use strict;
use warnings;
my @arr=qw(cat rat mat sat);
my $ok = { map{ $_ => 0 } @arr};
my $wrong;
exists $ok->{$_} ? $ok->{$_}++ : $wrong->{$_}++ for @ARGV;
print "OK $_ : $ok->{$_}\n" for @arr;
print "NO $_ : $wrong->{$_}\n" for (sort keys %$wrong);
使用
perl arg.pl bat cat ded rat mat foo bar foo cat
输出
OK cat : 2
OK rat : 1
OK mat : 1
OK sat : 0
NO bar : 1
NO bat : 1
NO ded : 1
NO foo : 2