Perl函数参数消失。为什么?

时间:2012-06-21 12:38:16

标签: perl undefined matching function-calls

我正在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];
}

1 个答案:

答案 0 :(得分:6)

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

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

如果有0个匹配项,则会在列表中获得另外2个参数。

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

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