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