如何在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
相关产品推荐
相关产品推荐

