Perl:使用smartmatch op根据值数组搜索字符串

时间:2013-05-30 18:32:48

标签: regex perl list smartmatch

考虑一个字符串,如响应头:HTTP/1.1 404 Not Found

我很好奇你是否可以使用smartmatch (~~ or double tilde) operator和正则表达式的组合来搜索匹配的不完整或子集。

my $head    = q{HTTP/1.1 404 Not Found};
my @success = (200, 201);
my @failure = (404, 409);

# Array First
say q{Success} if @success ~~ $head;
say q{Fail}    if @failure ~~ $head;

# Array Second
say q{Success} if $head ~~ @success ;
say q{Fail}    if $head ~~ @failure ;

我知道这可以通过某种循环,grep或map来完成;但我正在研究~~可以做什么和不能做什么的可能性。

该文档非常具有描述性,并且对于大多数lhs / rhs条件似乎遵循返回true [左侧全部] == [右侧所有] 评估。

也就是说,如果$head只是数字(例如$head=q{200}),它就会匹配。


预期结果类似于:

my $head      = q{HTTP/1.1 201 OK};
my @success   = qw(200 201);
say q{Success} if grep{$head =~ /$_/ } @success;

1 个答案:

答案 0 :(得分:1)

正如Schwern先前所指出的,智能匹配运算符目前被标记为实验/弃用 [1] ,因此不建议切换到智能匹配运算符。

此外,无论如何构建正则表达式可能更好。

my @success = (200, 201);
my @failure = (404, 409);

my $success_pat = join '|', map quotemeta, @success;
my $failure_pat = join '|', map quotemeta, @failure;

my $success_re = qr/$success_pat/;
my $failure_re = qr/$failure_pat/;

say q{Success} if $head =~ $success_re;
say q{Fail}    if $head =~ $failure_re;

  1. 每个特定THING ~~ THING应该做的事情总是不和谐,所以Perl正在转向更清晰的事情,可能类似于Smart::MatchTHING ~~ FUNC(THING)方法。