想要从具有多个数字的变量中精确匹配数字,该变量由管道符号分隔,类似于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
答案 0 :(得分:2)
如果此正则表达式绑定的字符串包含/148|1|0|256/
,148
,1
或0
的子字符串,则正则表达式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\";"