我正在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];
}
答案 0 :(得分:6)
eq
总是返回true或false,但=~
(在列表上下文中时)返回“由模式中括号匹配的子表达式组成的列表”。
当您将列表放在另一个列表中时(例如,子例程的参数列表中的匹配列表),它们会合并。
如果有0个匹配项,则会在列表中获得另外2个参数。
如果有2个匹配,则获得这2个匹配,然后获得2个其他参数,总共4个参数。
您的代码取决于正好有三个参数。