perl匹配来自类似于egrep的变量的多个数字

时间:2013-02-13 10:04:39

标签: regex perl

想要从具有多个数字的变量中精确匹配数字,该变量由管道符号分隔,类似于egrep.below是我尝试过的代码。

#!/usr/bin/perl

my $searchnum = $ARGV[0];

my $num = "148|1|0|256";
print $num;

if ($searchnum =~ /$num/)
{
    print "found";
}
else
{
    print "not-found";
}

预期o / p

perl number_match.pl 1
found
perl number_match.pl 1432
not-found

2 个答案:

答案 0 :(得分:2)

如果此正则表达式绑定的字符串包含/148|1|0|256/14810的子字符串,则正则表达式256匹配。这意味着选项148是多余的,因为它匹配与1匹配的字符串子集。

您可能想要测试给定字符串是否等于这些选项之一。如果要使用正则表达式,则必须将正则表达式锚定在字符串的开头和结尾处:

/^ (?:148|1|0|256) $/x

你也可以使用grep内置:

my $number = ...;
if (grep {$number eq $_} qw/148 1 0 256/) { say "found"     }
else                                      { say "not-found" }

grep函数接受一个必须返回布尔值的块。它返回条件返回true右侧列表中的所有元素。如果至少有一个元素匹配,那么整个表达式的计算结果为真。

您还可以使用包含所有可能选项的哈希:

my $number = ...;
my %options = map { $_ => undef } qw/148 1 0 256/;
if ( exists $options{$number} ) { say "found"     }
else                            { say "not-found" }

这比grep更有效。

答案 1 :(得分:1)

使用:

my $num = '^(148|1|0|256)$';

这是一个oneliner:

perl -e "$_=$ARGV[0]; exit if !/^\d+$/; print \"not-\" unless /^(14|156|0|89)$/;print \"found\n\";"