2

我正在用 Perl 构建一个压力系统来纠正学生的编程作业。我构建了一个check(<boolean>,<congrats-message>,<blame-message>)应该在此过程中帮助我的函数。

当我调用它时

check(get_option('content-type') eq "text/html","good type", "bad type");

一切安好。但如果我敢做

check(get_option('content-type') =~ m:text/html:i, "good type", "bad type");

当正则表达式找不到匹配项时,它会中断。实际上它相当于一个check("good type", "bad type"). 我在 check() 函数中只使用$_[0],$_[1]等等,这不像我有 'undef' 作为第一个参数:我真的可以用die unless $#_ == 2.

发生了什么 ?我解决了这个问题

check((get_option('content-type') =~ m:text/html:i && 1), "good type", "bad type");

但我很想了解这种奇怪情况的原因和原因。

--

sub check {
  if ($_[0]) {
    $okay++;
    print STDERR "^_^ $_[1] ($okay)\n";
  } else {
    print STDERR ">_< $_[2]\n";
  }
  return $_[0];
}
4

1 回答 1

6

eq总是返回真或假,但=~(在列表上下文中)返回“由模式中括号匹配的子表达式组成的列表”。

当您将一个列表放入另一个列表中时(例如,子例程的参数列表中的匹配列表),它们会被合并。

如果有 0 个匹配项,您将获得列表中的另外 2 个参数。

如果有 2 个匹配项,您将获得这 2 个匹配项,然后是 2 个其他参数,总共 4 个参数。

您的代码取决于恰好有三个参数。

于 2012-06-21T12:43:27.383 回答