现在,我有一个MAIN可以接受一个或多个字符串参数的子.但我使用两个单独的参数MAIN来做到这一点:
sub MAIN (
Str:D $file,
*@files,
) {
@files.prepend: $file;
# Rest of the program
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否有更惯用的方法来实现这一点,因为我目前的解决方案感觉有点笨重,而不是非常Perly.
Bra*_*ert 10
你可以用一个 proto sub
proto sub MAIN ( $, *@ ){*}
multi sub MAIN ( *@files ) {
# Rest of the program
}
Run Code Online (Sandbox Code Playgroud)
或者使用子签名解压缩
sub MAIN ( *@files ($,*@) ) {
# Rest of the program
}
Run Code Online (Sandbox Code Playgroud)
冒着“过度回答”的风险 - 我对“Perly”的看法尽可能简洁而不会变得晦涩(也许我只是用另外两个术语替换一个主观术语......:-)
如果您有一个“slurpy”数组作为唯一参数,那么它会很乐意接受任何超出您在注释中放入的规范之外的参数。然而,默认情况下,位置参数是强制性的,并且仅当您想排除所有多重的约束时才需要原型- 对于您在这里想要的东西来说可能有点过分了。所以,这就足够了:
sub MAIN($file , *@others) {
say "Received file, $file, and @others.elems() others."
}
Run Code Online (Sandbox Code Playgroud)
这与 mr_ron 所写的很接近 - 但为什么不使用默认的使用消息,MAIN 通过检查你的参数来为你提供:
$ ./f.pl
Usage:
./f.pl <file> [<others> ...]
Run Code Online (Sandbox Code Playgroud)
有些人可能会说我通过在第一个参数上删除Str类型约束来作弊,但是当您限制为字符串时,它实际上并没有给您带来太多好处,因为在 CLI 中指定的数字以IntStr类型(一种混合类型)的形式出现满足 Str 约束。OTOH,当将 CLI 参数限制为 Num 或 Int 时,Perl6 将检查您是否确实在其中放置了数字 - 或者至少检查了 unicode 认为的数字。
如果您想要实际的文件名,您可以通过限制输入来节省验证步骤IO()。那么只有当你命名一个文件时它才会起作用。最后,where .r在参数后面添加将保证它在启动时可读:
sub MAIN(IO() $file where .r, *@others) { ...
Run Code Online (Sandbox Code Playgroud)
一小行坚持一个强制参数,该参数是引用可读文件的文件名,具有不同数量的其他参数,如果一切都偏离了方向,则会自动生成一条有用的使用消息...