You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解并运行Mojolicious示例中的sub ($c) {...}语法?

这问题我之前也碰到过,其实根源在于Perl版本对子例程签名特性的支持差异,咱们一步步拆解:

错误原因

你看到的Illegal character in prototype错误,核心逻辑很清晰:

  • 官网示例里的sub ($c)是Perl子例程签名语法,这是Perl 5.20版本才正式引入的新特性,目的是让子例程参数的写法更简洁直观
  • 你的Strawberry Perl版本低于5.20,旧版本Perl会把sub ($c)里的($c)当成子例程原型来解析,但Perl的子例程原型只允许使用$、@、%这类符号,不能用具体的变量名$c,所以直接抛出了“非法字符”的错误
  • 另外,Mojolicious::Lite开头的-signatures参数,是用来自动帮你启用use feature 'signatures'特性的,但这个参数只有在Perl 5.20+的环境下才会生效,旧版本里它起不到作用,自然就没法正确解析签名语法
解决办法

有两个可行的方案,你可以根据自己的情况选择:

方案1:升级Perl版本

直接把你的Strawberry Perl升级到5.20或更高版本(推荐安装最新的稳定版),升级完成后:

  • 官网示例里的sub ($c)写法会被正确识别为子例程签名
  • Mojolicious::Lite的-signatures参数也能正常启用特性,代码可以直接运行,不用做任何修改

方案2:兼容旧版本的写法调整

如果暂时没法升级Perl,就把示例里的签名写法改成你已经在使用的传统风格:
把示例中的:

get '/' => sub ($c) { $c->render(template => 'index'); };

替换成你熟悉的:

get '/' => sub { my $c = shift; $c->render(template => 'index'); };

这种写法兼容所有Perl版本,和你现有代码的风格完全一致,也能正常编译运行。

内容的提问来源于stack exchange,提问作者Hao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:20:20