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

标签 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") .我只使用 $_[0] , $_[1]等在 check() 函数中,这不像我将 '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 总是返回 true 或 false,但是 =~(当在列表上下文中时)返回“由与模式中括号匹配的子表达式组成的列表”, .

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

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

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

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

关于Perl 函数参数消失。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138341/

相关文章:

javascript - 附加到匹配另一个数组的多维数组

perl - 如何使用 unix 命令将字符串拆分为具有特定宽度的行?当输入字符串是无限的?

perl - 我可以从 Perl foreach 循环中提取下一个元素吗?

windows - 如何在不丢失模块的情况下在 Windows 上更新 Perl?

node.js - 跨服务器的 NodeJS 匹配

swift - 如何优化这个在图中找到所有最大匹配的算法?

perl - 如何调用在另一个包中声明的子例程而不在子例程名称前加上它的包名?

Haskell 语义未定义值

javascript - JS window.answer 在另一个 html 页面上未定义

undefined variable (opencart)