【问题标题】:Perl: Use smartmatch op to search string against array of valuesPerl:使用 smartmatch 操作根据值数组搜索字符串
【发布时间】:2013-06-02 03:24:05
【问题描述】:

考虑一个字符串,例如响应标头: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 或映射来完成;但我正在调查~~ 能做什么和不能做什么的可能性。

文档非常具有描述性,并且对于大多数 lhs/rhs 条件似乎遵循 对于 [all in left side] == [all in right side] 评估的返回 true。 p>

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


预期结果类似于:

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

【问题讨论】:

  • 不幸的是,智能匹配运算符一直是re-declared experimental in 5.18.0,现在抛出警告。鉴于它持续不稳定,而且它的行为可能会改变,我建议不要使用它。

标签: regex perl list smartmatch


【解决方案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) 方法。

【讨论】:

  • 原本打算这样做,希望 smartmatch 是 smartmatchical :] 但正如 Schwern 指出的那样,这可能是个坏主意
  • 如果您要多次执行此操作,则速度会更慢。
  • 智能匹配?还是grep?我猜一个正则表达式(通过加入数组)会更快,特别是如果首先按最有可能匹配的方式排序。
  • Reapetedly 比较最多 N 个字符串会变慢,重复尝试匹配 1 个正则表达式。从 5.10 开始,会从交替中创建一个 trie,所以速度非常快。排序不会有太大帮助。
  • 同意第一点;关于排序,我认为它会在第一次匹配时返回,因此如果数组中的第一个选项(一个小正则表达式)匹配字符串,它将不会继续评估其余的数组元素(用于智能匹配)。正则表达式中的排序不太重要,具体取决于正则表达式选项的复杂性(以及正则表达式引擎的操作顺序)。
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多