perl程序通过比较现有数组

时间:2017-03-17 11:40:39

标签: perl

我正在尝试编写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中找到

任何人都可以告诉我该脚本需要做什么才能发挥作用。

4 个答案:

答案 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)

TIMTOWDI

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