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

如何在MAIN子例程中要求1个或多个参数?求地道Perl实现

更地道的Raku MAIN子例程写法处理多文件参数

嘿,这个需求太常见了!你当前的写法确实能实现功能,但确实有更符合Raku(原Perl 6)风格的简洁方式,完全不用手动做prepend操作。

方法一:用带约束的非空数组参数

直接声明一个至少包含一个Str:D元素的数组参数,Raku会自动把所有传入的命令行参数打包到这个数组里,同时确保参数数量符合要求:

sub MAIN ( Str:D @files where *.elems >= 1 ) {
    # 这里直接使用@files即可,它已经包含了所有传入的文件路径
    say "即将处理的文件: " ~ @files.join("\n");
    # 程序剩余逻辑...
}

这个写法的好处是:

  • 语义清晰:一眼就能看出我们需要至少一个字符串类型的文件参数
  • 自动参数校验:如果用户不传任何参数,Raku会自动抛出友好的错误提示,不用自己写判断逻辑
  • 省去手动合并参数的步骤,代码更简洁

方法二:简化的slurpy参数写法

如果你更喜欢保留slurpy参数的写法,也可以直接把第一个参数和slurpy参数合并成一个表达式,不用单独调用prepend:

sub MAIN ( Str:D $file, Str:D *@files ) {
    my @all-files = $file, |@files; # 用|展开slurpy数组,直接合并
    # 后续用@all-files处理即可
}

不过相比第一种方法,这个写法还是多了一步合并操作,不如直接用带约束的数组参数来得地道。

额外小贴士

Raku的MAIN子例程会自动处理命令行参数的解析和类型校验,比如如果用户传入了非字符串类型的参数(比如数字),它会自动提示类型错误,这比手动处理要省心很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:19