1

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

#!/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
4

2 回答 2

2

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

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

/^ (?: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

于 2013-02-13T10:48:51.837 回答
1

采用:

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

这是一个单行:

perl -e "$_=$ARGV[0]; exit if !/^\d+$/; print \"not-\" unless /^(14|156|0|89)$/;print \"found\n\";"
于 2013-02-13T11:10:41.580 回答